devices/e1000e/es2lan-2.6.35-orig.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 2290 0a6fc3f5f418
permissions -rw-r--r--
devices/ccat: revert "limit rx processing to one frame per poll"

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
2290
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2009 Intel Corporation.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 * 80003ES2LAN Gigabit Ethernet Controller (Copper)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 * 80003ES2LAN Gigabit Ethernet Controller (Serdes)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include "e1000.h"
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL	 0x00
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define E1000_KMRNCTRLSTA_OFFSET_INB_CTRL	 0x02
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define E1000_KMRNCTRLSTA_OFFSET_HD_CTRL	 0x10
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#define E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE	 0x1F
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#define E1000_KMRNCTRLSTA_FIFO_CTRL_RX_BYPASS	 0x0008
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#define E1000_KMRNCTRLSTA_FIFO_CTRL_TX_BYPASS	 0x0800
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#define E1000_KMRNCTRLSTA_INB_CTRL_DIS_PADDING	 0x0010
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#define E1000_KMRNCTRLSTA_HD_CTRL_10_100_DEFAULT 0x0004
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT	 0x0000
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#define E1000_KMRNCTRLSTA_OPMODE_E_IDLE		 0x2000
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define E1000_KMRNCTRLSTA_OPMODE_MASK		 0x000C
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#define E1000_KMRNCTRLSTA_OPMODE_INBAND_MDIO	 0x0004
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
#define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#define DEFAULT_TCTL_EXT_GCEX_80003ES2LAN	 0x00010000
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
#define DEFAULT_TIPG_IPGT_1000_80003ES2LAN	 0x8
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
#define DEFAULT_TIPG_IPGT_10_100_80003ES2LAN	 0x9
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
/* GG82563 PHY Specific Status Register (Page 0, Register 16 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
#define GG82563_PSCR_POLARITY_REVERSAL_DISABLE	 0x0002 /* 1=Reversal Disab. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
#define GG82563_PSCR_CROSSOVER_MODE_MASK	 0x0060
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
#define GG82563_PSCR_CROSSOVER_MODE_MDI		 0x0000 /* 00=Manual MDI */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
#define GG82563_PSCR_CROSSOVER_MODE_MDIX	 0x0020 /* 01=Manual MDIX */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
#define GG82563_PSCR_CROSSOVER_MODE_AUTO	 0x0060 /* 11=Auto crossover */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
/* PHY Specific Control Register 2 (Page 0, Register 26) */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define GG82563_PSCR2_REVERSE_AUTO_NEG		 0x2000
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
						/* 1=Reverse Auto-Negotiation */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
/* MAC Specific Control Register (Page 2, Register 21) */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
/* Tx clock speed for Link Down and 1000BASE-T for the following speeds */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define GG82563_MSCR_TX_CLK_MASK		 0x0007
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define GG82563_MSCR_TX_CLK_10MBPS_2_5		 0x0004
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define GG82563_MSCR_TX_CLK_100MBPS_25		 0x0005
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define GG82563_MSCR_TX_CLK_1000MBPS_25		 0x0007
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define GG82563_MSCR_ASSERT_CRS_ON_TX		 0x0010 /* 1=Assert */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
/* DSP Distance Register (Page 5, Register 26) */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define GG82563_DSPD_CABLE_LENGTH		 0x0007 /* 0 = <50M
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
							   1 = 50-80M
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
							   2 = 80-110M
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
							   3 = 110-140M
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
							   4 = >140M */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
/* Kumeran Mode Control Register (Page 193, Register 16) */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define GG82563_KMCR_PASS_FALSE_CARRIER		 0x0800
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
/* Max number of times Kumeran read/write should be validated */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define GG82563_MAX_KMRN_RETRY  0x5
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
/* Power Management Control Register (Page 193, Register 20) */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define GG82563_PMCR_ENABLE_ELECTRICAL_IDLE	 0x0001
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
					   /* 1=Enable SERDES Electrical Idle */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
/* In-Band Control Register (Page 194, Register 18) */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
#define GG82563_ICR_DIS_PADDING			 0x0010 /* Disable Padding */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
 * A table for the GG82563 cable length where the range is defined
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
 * with a lower bound at "index" and the upper bound at
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
 * "index + 5".
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
static const u16 e1000_gg82563_cable_length_table[] =
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	 { 0, 60, 115, 150, 150, 60, 115, 150, 180, 180, 0xFF };
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
#define GG82563_CABLE_LENGTH_TABLE_SIZE \
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
		ARRAY_SIZE(e1000_gg82563_cable_length_table)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
static s32 e1000_acquire_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
static void e1000_release_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
static void e1000_initialize_hw_bits_80003es2lan(struct e1000_hw *hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
static s32 e1000_cfg_on_link_up_80003es2lan(struct e1000_hw *hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
static s32  e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
                                            u16 *data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
static s32  e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
                                             u16 data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
static void e1000_power_down_phy_copper_80003es2lan(struct e1000_hw *hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
 *  e1000_init_phy_params_80003es2lan - Init ESB2 PHY func ptrs.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
static s32 e1000_init_phy_params_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	struct e1000_phy_info *phy = &hw->phy;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	if (hw->phy.media_type != e1000_media_type_copper) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
		phy->type	= e1000_phy_none;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
		return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	} else {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
		phy->ops.power_up = e1000_power_up_phy_copper;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
		phy->ops.power_down = e1000_power_down_phy_copper_80003es2lan;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	phy->addr		= 1;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	phy->autoneg_mask	= AUTONEG_ADVERTISE_SPEED_DEFAULT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	phy->reset_delay_us      = 100;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	phy->type		= e1000_phy_gg82563;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	/* This can only be done after all function pointers are setup. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	ret_val = e1000e_get_phy_id(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	/* Verify phy id */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	if (phy->id != GG82563_E_PHY_ID)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
		return -E1000_ERR_PHY;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
 *  e1000_init_nvm_params_80003es2lan - Init ESB2 NVM func ptrs.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	struct e1000_nvm_info *nvm = &hw->nvm;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
	u32 eecd = er32(EECD);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
	u16 size;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	nvm->opcode_bits	= 8;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	nvm->delay_usec	 = 1;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	switch (nvm->override) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	case e1000_nvm_override_spi_large:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
		nvm->page_size    = 32;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
		nvm->address_bits = 16;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
	case e1000_nvm_override_spi_small:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
		nvm->page_size    = 8;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
		nvm->address_bits = 8;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
	default:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
		nvm->page_size    = eecd & E1000_EECD_ADDR_BITS ? 32 : 8;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
		nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	nvm->type = e1000_nvm_eeprom_spi;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >>
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
			  E1000_EECD_SIZE_EX_SHIFT);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	 * Added to a constant, "size" becomes the left-shift value
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	 * for setting word_size.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
	size += NVM_WORD_SIZE_BASE_SHIFT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
	/* EEPROM access above 16k is unsupported */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
	if (size > 14)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
		size = 14;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	nvm->word_size	= 1 << size;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
 *  e1000_init_mac_params_80003es2lan - Init ESB2 MAC func ptrs.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
static s32 e1000_init_mac_params_80003es2lan(struct e1000_adapter *adapter)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	struct e1000_hw *hw = &adapter->hw;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	struct e1000_mac_info *mac = &hw->mac;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	struct e1000_mac_operations *func = &mac->ops;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	/* Set media type */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	switch (adapter->pdev->device) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
		hw->phy.media_type = e1000_media_type_internal_serdes;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	default:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
		hw->phy.media_type = e1000_media_type_copper;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	/* Set mta register count */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	mac->mta_reg_count = 128;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	/* Set rar entry count */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	mac->rar_entry_count = E1000_RAR_ENTRIES;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	/* FWSM register */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	mac->has_fwsm = true;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	/* ARC supported; valid only if manageability features are enabled. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	mac->arc_subsystem_valid =
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	        (er32(FWSM) & E1000_FWSM_MODE_MASK)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	                ? true : false;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	/* Adaptive IFS not supported */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	mac->adaptive_ifs = false;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	/* check for link */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	switch (hw->phy.media_type) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	case e1000_media_type_copper:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
		func->setup_physical_interface = e1000_setup_copper_link_80003es2lan;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
		func->check_for_link = e1000e_check_for_copper_link;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	case e1000_media_type_fiber:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
		func->setup_physical_interface = e1000e_setup_fiber_serdes_link;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
		func->check_for_link = e1000e_check_for_fiber_link;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	case e1000_media_type_internal_serdes:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
		func->setup_physical_interface = e1000e_setup_fiber_serdes_link;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
		func->check_for_link = e1000e_check_for_serdes_link;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	default:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
		return -E1000_ERR_CONFIG;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	/* set lan id for port to determine which phy lock to use */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	hw->mac.ops.set_lan_id(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
static s32 e1000_get_variants_80003es2lan(struct e1000_adapter *adapter)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	struct e1000_hw *hw = &adapter->hw;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	s32 rc;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	rc = e1000_init_mac_params_80003es2lan(adapter);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	if (rc)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
		return rc;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	rc = e1000_init_nvm_params_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	if (rc)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
		return rc;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	rc = e1000_init_phy_params_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	if (rc)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
		return rc;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
 *  e1000_acquire_phy_80003es2lan - Acquire rights to access PHY
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
 *  A wrapper to acquire access rights to the correct PHY.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
static s32 e1000_acquire_phy_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	u16 mask;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	return e1000_acquire_swfw_sync_80003es2lan(hw, mask);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
 *  e1000_release_phy_80003es2lan - Release rights to access PHY
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
 *  A wrapper to release access rights to the correct PHY.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
static void e1000_release_phy_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	u16 mask;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	e1000_release_swfw_sync_80003es2lan(hw, mask);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
 *  e1000_acquire_mac_csr_80003es2lan - Acquire rights to access Kumeran register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
 *  Acquire the semaphore to access the Kumeran interface.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
static s32 e1000_acquire_mac_csr_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	u16 mask;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	mask = E1000_SWFW_CSR_SM;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	return e1000_acquire_swfw_sync_80003es2lan(hw, mask);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
 *  e1000_release_mac_csr_80003es2lan - Release rights to access Kumeran Register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
 *  Release the semaphore used to access the Kumeran interface
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
static void e1000_release_mac_csr_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	u16 mask;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	mask = E1000_SWFW_CSR_SM;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	e1000_release_swfw_sync_80003es2lan(hw, mask);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
 *  e1000_acquire_nvm_80003es2lan - Acquire rights to access NVM
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
 *  Acquire the semaphore to access the EEPROM.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
static s32 e1000_acquire_nvm_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	ret_val = e1000_acquire_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	ret_val = e1000e_acquire_nvm(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
		e1000_release_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
 *  e1000_release_nvm_80003es2lan - Relinquish rights to access NVM
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
 *  Release the semaphore used to access the EEPROM.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
static void e1000_release_nvm_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	e1000e_release_nvm(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	e1000_release_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
 *  e1000_acquire_swfw_sync_80003es2lan - Acquire SW/FW semaphore
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
 *  @mask: specifies which semaphore to acquire
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
 *  Acquire the SW/FW semaphore to access the PHY or NVM.  The mask
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
 *  will also specify which port we're acquiring the lock for.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
static s32 e1000_acquire_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	u32 swfw_sync;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	u32 swmask = mask;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	u32 fwmask = mask << 16;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	s32 i = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	s32 timeout = 50;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	while (i < timeout) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
		if (e1000e_get_hw_semaphore(hw))
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
			return -E1000_ERR_SWFW_SYNC;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
		swfw_sync = er32(SW_FW_SYNC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
		if (!(swfw_sync & (fwmask | swmask)))
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
			break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
		/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
		 * Firmware currently using resource (fwmask)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
		 * or other software thread using resource (swmask)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
		 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
		e1000e_put_hw_semaphore(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
		mdelay(5);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
		i++;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	if (i == timeout) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
		e_dbg("Driver can't access resource, SW_FW_SYNC timeout.\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
		return -E1000_ERR_SWFW_SYNC;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	swfw_sync |= swmask;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	ew32(SW_FW_SYNC, swfw_sync);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	e1000e_put_hw_semaphore(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
 *  e1000_release_swfw_sync_80003es2lan - Release SW/FW semaphore
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
 *  @mask: specifies which semaphore to acquire
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
 *  Release the SW/FW semaphore used to access the PHY or NVM.  The mask
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
 *  will also specify which port we're releasing the lock for.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
static void e1000_release_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	u32 swfw_sync;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	while (e1000e_get_hw_semaphore(hw) != 0);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	/* Empty */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	swfw_sync = er32(SW_FW_SYNC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	swfw_sync &= ~mask;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	ew32(SW_FW_SYNC, swfw_sync);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	e1000e_put_hw_semaphore(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
 *  e1000_read_phy_reg_gg82563_80003es2lan - Read GG82563 PHY register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
 *  @offset: offset of the register to read
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
 *  @data: pointer to the data returned from the operation
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
 *  Read the GG82563 PHY register.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
						  u32 offset, u16 *data)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	u32 page_select;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	u16 temp;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	ret_val = e1000_acquire_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	/* Select Configuration Page */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	if ((offset & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
		page_select = GG82563_PHY_PAGE_SELECT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	} else {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
		/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
		 * Use Alternative Page Select register to access
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
		 * registers 30 and 31
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
		 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
		page_select = GG82563_PHY_PAGE_SELECT_ALT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	temp = (u16)((u16)offset >> GG82563_PAGE_SHIFT);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	ret_val = e1000e_write_phy_reg_mdic(hw, page_select, temp);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	if (ret_val) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
		e1000_release_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	if (hw->dev_spec.e80003es2lan.mdic_wa_enable == true) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
		/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
		 * The "ready" bit in the MDIC register may be incorrectly set
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
		 * before the device has completed the "Page Select" MDI
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
		 * transaction.  So we wait 200us after each MDI command...
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
		 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
		udelay(200);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
		/* ...and verify the command was successful. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
		ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
		if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
			ret_val = -E1000_ERR_PHY;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
			e1000_release_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
		}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
		udelay(200);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
		ret_val = e1000e_read_phy_reg_mdic(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
		                                  MAX_PHY_REG_ADDRESS & offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
		                                  data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
		udelay(200);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	} else {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
		ret_val = e1000e_read_phy_reg_mdic(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
		                                  MAX_PHY_REG_ADDRESS & offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
		                                  data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	e1000_release_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
 *  e1000_write_phy_reg_gg82563_80003es2lan - Write GG82563 PHY register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
 *  @offset: offset of the register to read
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
 *  @data: value to write to the register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
 *  Write to the GG82563 PHY register.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
static s32 e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
						   u32 offset, u16 data)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	u32 page_select;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	u16 temp;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	ret_val = e1000_acquire_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	/* Select Configuration Page */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	if ((offset & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
		page_select = GG82563_PHY_PAGE_SELECT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	} else {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
		/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		 * Use Alternative Page Select register to access
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
		 * registers 30 and 31
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
		page_select = GG82563_PHY_PAGE_SELECT_ALT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	temp = (u16)((u16)offset >> GG82563_PAGE_SHIFT);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	ret_val = e1000e_write_phy_reg_mdic(hw, page_select, temp);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	if (ret_val) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
		e1000_release_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	if (hw->dev_spec.e80003es2lan.mdic_wa_enable == true) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		 * The "ready" bit in the MDIC register may be incorrectly set
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		 * before the device has completed the "Page Select" MDI
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		 * transaction.  So we wait 200us after each MDI command...
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
		 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
		udelay(200);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		/* ...and verify the command was successful. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
		ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
			e1000_release_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
			return -E1000_ERR_PHY;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
		}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
		udelay(200);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
		ret_val = e1000e_write_phy_reg_mdic(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
		                                  MAX_PHY_REG_ADDRESS & offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
		                                  data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
		udelay(200);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	} else {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
		ret_val = e1000e_write_phy_reg_mdic(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
		                                  MAX_PHY_REG_ADDRESS & offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
		                                  data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	e1000_release_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
 *  e1000_write_nvm_80003es2lan - Write to ESB2 NVM
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
 *  @offset: offset of the register to read
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
 *  @words: number of words to write
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
 *  @data: buffer of data to write to the NVM
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
 *  Write "words" of data to the ESB2 NVM.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
static s32 e1000_write_nvm_80003es2lan(struct e1000_hw *hw, u16 offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
				       u16 words, u16 *data)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	return e1000e_write_nvm_spi(hw, offset, words, data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
 *  e1000_get_cfg_done_80003es2lan - Wait for configuration to complete
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
 *  Wait a specific amount of time for manageability processes to complete.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
 *  This is a function pointer entry point called by the phy module.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
static s32 e1000_get_cfg_done_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	s32 timeout = PHY_CFG_TIMEOUT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	u32 mask = E1000_NVM_CFG_DONE_PORT_0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	if (hw->bus.func == 1)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
		mask = E1000_NVM_CFG_DONE_PORT_1;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	while (timeout) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
		if (er32(EEMNGCTL) & mask)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
			break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
		msleep(1);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
		timeout--;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	if (!timeout) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
		e_dbg("MNG configuration cycle has not completed.\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
		return -E1000_ERR_RESET;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
 *  e1000_phy_force_speed_duplex_80003es2lan - Force PHY speed and duplex
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
 *  Force the speed and duplex settings onto the PHY.  This is a
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
 *  function pointer entry point called by the phy module.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
static s32 e1000_phy_force_speed_duplex_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	u16 phy_data;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	bool link;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	 * Clear Auto-Crossover to force MDI manually.  M88E1000 requires MDI
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	 * forced whenever speed and duplex are forced.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_AUTO;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
	ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL, phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	e_dbg("GG82563 PSCR: %X\n", phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	/* Reset the phy to commit changes. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	phy_data |= MII_CR_RESET;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
	ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	udelay(1);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	if (hw->phy.autoneg_wait_to_complete) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
		e_dbg("Waiting for forced speed/duplex link "
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
			 "on GG82563 phy.\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
		ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
						     100000, &link);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
		if (!link) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
			/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
			 * We didn't get link.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
			 * Reset the DSP and cross our fingers.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
			 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
			ret_val = e1000e_phy_reset_dsp(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
			if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
				return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
		}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
		/* Try once more */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
		ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
						     100000, &link);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	ret_val = e1e_rphy(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	 * Resetting the phy means we need to verify the TX_CLK corresponds
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	 * to the link speed.  10Mbps -> 2.5MHz, else 25MHz.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	phy_data &= ~GG82563_MSCR_TX_CLK_MASK;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	if (hw->mac.forced_speed_duplex & E1000_ALL_10_SPEED)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		phy_data |= GG82563_MSCR_TX_CLK_10MBPS_2_5;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	else
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
		phy_data |= GG82563_MSCR_TX_CLK_100MBPS_25;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	 * In addition, we must re-enable CRS on Tx for both half and full
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	 * duplex.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
	phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	ret_val = e1e_wphy(hw, GG82563_PHY_MAC_SPEC_CTRL, phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
 *  e1000_get_cable_length_80003es2lan - Set approximate cable length
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
 *  Find the approximate cable length as measured by the GG82563 PHY.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
 *  This is a function pointer entry point called by the phy module.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	struct e1000_phy_info *phy = &hw->phy;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	s32 ret_val = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	u16 phy_data, index;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	ret_val = e1e_rphy(hw, GG82563_PHY_DSP_DISTANCE, &phy_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
		goto out;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	index = phy_data & GG82563_DSPD_CABLE_LENGTH;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
	if (index >= GG82563_CABLE_LENGTH_TABLE_SIZE - 5) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
		ret_val = -E1000_ERR_PHY;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		goto out;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
	phy->min_cable_length = e1000_gg82563_cable_length_table[index];
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	phy->max_cable_length = e1000_gg82563_cable_length_table[index + 5];
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
out:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
 *  e1000_get_link_up_info_80003es2lan - Report speed and duplex
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
 *  @speed: pointer to speed buffer
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
 *  @duplex: pointer to duplex buffer
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
 *  Retrieve the current speed and duplex configuration.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
static s32 e1000_get_link_up_info_80003es2lan(struct e1000_hw *hw, u16 *speed,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
					      u16 *duplex)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	if (hw->phy.media_type == e1000_media_type_copper) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		ret_val = e1000e_get_speed_and_duplex_copper(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
								    speed,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
								    duplex);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
		hw->phy.ops.cfg_on_link_up(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	} else {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		ret_val = e1000e_get_speed_and_duplex_fiber_serdes(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
								  speed,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
								  duplex);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
 *  e1000_reset_hw_80003es2lan - Reset the ESB2 controller
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
 *  Perform a global reset to the ESB2 controller.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	u32 ctrl, icr;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	 * Prevent the PCI-E bus from sticking if there is no TLP connection
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	 * on the last TLP read/write transaction when MAC is reset.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	ret_val = e1000e_disable_pcie_master(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
		e_dbg("PCI-E Master disable polling has failed.\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	e_dbg("Masking off all interrupts\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	ew32(IMC, 0xffffffff);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	ew32(RCTL, 0);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	ew32(TCTL, E1000_TCTL_PSP);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	e1e_flush();
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	msleep(10);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
	ctrl = er32(CTRL);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	ret_val = e1000_acquire_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	e_dbg("Issuing a global reset to MAC\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	ew32(CTRL, ctrl | E1000_CTRL_RST);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	e1000_release_phy_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	ret_val = e1000e_get_auto_rd_done(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
		/* We don't want to continue accessing MAC registers. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	/* Clear any pending interrupt events. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	ew32(IMC, 0xffffffff);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	icr = er32(ICR);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	ret_val = e1000_check_alt_mac_addr_generic(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
 *  e1000_init_hw_80003es2lan - Initialize the ESB2 controller
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
 *  Initialize the hw bits, LED, VFTA, MTA, link and hw counters.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	struct e1000_mac_info *mac = &hw->mac;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	u32 reg_data;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	u16 i;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
	e1000_initialize_hw_bits_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
	/* Initialize identification LED */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	ret_val = e1000e_id_led_init(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		e_dbg("Error initializing identification LED\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		/* This is not fatal and we should not stop init due to this */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	/* Disabling VLAN filtering */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
	e_dbg("Initializing the IEEE VLAN\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
	mac->ops.clear_vfta(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	/* Setup the receive address. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	e1000e_init_rx_addrs(hw, mac->rar_entry_count);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	/* Zero out the Multicast HASH table */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
	e_dbg("Zeroing the MTA\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
	for (i = 0; i < mac->mta_reg_count; i++)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
		E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	/* Setup link and flow control */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
	ret_val = e1000e_setup_link(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	/* Set the transmit descriptor write-back policy */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
	reg_data = er32(TXDCTL(0));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) |
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
		   E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
	ew32(TXDCTL(0), reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	/* ...for both queues. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
	reg_data = er32(TXDCTL(1));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
	reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) |
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		   E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	ew32(TXDCTL(1), reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
	/* Enable retransmit on late collisions */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	reg_data = er32(TCTL);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
	reg_data |= E1000_TCTL_RTLC;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
	ew32(TCTL, reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	/* Configure Gigabit Carry Extend Padding */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	reg_data = er32(TCTL_EXT);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	reg_data &= ~E1000_TCTL_EXT_GCEX_MASK;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	reg_data |= DEFAULT_TCTL_EXT_GCEX_80003ES2LAN;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	ew32(TCTL_EXT, reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	/* Configure Transmit Inter-Packet Gap */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	reg_data = er32(TIPG);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	reg_data &= ~E1000_TIPG_IPGT_MASK;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	reg_data |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	ew32(TIPG, reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	reg_data = E1000_READ_REG_ARRAY(hw, E1000_FFLT, 0x0001);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
	reg_data &= ~0x00100000;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	E1000_WRITE_REG_ARRAY(hw, E1000_FFLT, 0x0001, reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	/* default to true to enable the MDIC W/A */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	hw->dev_spec.e80003es2lan.mdic_wa_enable = true;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	ret_val = e1000_read_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	                              E1000_KMRNCTRLSTA_OFFSET >>
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	                              E1000_KMRNCTRLSTA_OFFSET_SHIFT,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	                              &i);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	if (!ret_val) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		if ((i & E1000_KMRNCTRLSTA_OPMODE_MASK) ==
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
		     E1000_KMRNCTRLSTA_OPMODE_INBAND_MDIO)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
			hw->dev_spec.e80003es2lan.mdic_wa_enable = false;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	 * Clear all of the statistics registers (clear on read).  It is
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	 * important that we do this after we have tried to establish link
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	 * because the symbol error count will increment wildly if there
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	 * is no link.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	e1000_clear_hw_cntrs_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
 *  e1000_initialize_hw_bits_80003es2lan - Init hw bits of ESB2
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
 *  Initializes required hardware-dependent bits needed for normal operation.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
static void e1000_initialize_hw_bits_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	u32 reg;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	/* Transmit Descriptor Control 0 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	reg = er32(TXDCTL(0));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	reg |= (1 << 22);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	ew32(TXDCTL(0), reg);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	/* Transmit Descriptor Control 1 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	reg = er32(TXDCTL(1));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	reg |= (1 << 22);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	ew32(TXDCTL(1), reg);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	/* Transmit Arbitration Control 0 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	reg = er32(TARC(0));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
	reg &= ~(0xF << 27); /* 30:27 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	if (hw->phy.media_type != e1000_media_type_copper)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
		reg &= ~(1 << 20);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	ew32(TARC(0), reg);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	/* Transmit Arbitration Control 1 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
	reg = er32(TARC(1));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	if (er32(TCTL) & E1000_TCTL_MULR)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		reg &= ~(1 << 28);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	else
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		reg |= (1 << 28);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	ew32(TARC(1), reg);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
 *  e1000_copper_link_setup_gg82563_80003es2lan - Configure GG82563 Link
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
 *  Setup some GG82563 PHY registers for obtaining link
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
static s32 e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
	struct e1000_phy_info *phy = &hw->phy;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	u32 ctrl_ext;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	u16 data;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	ret_val = e1e_rphy(hw, GG82563_PHY_MAC_SPEC_CTRL, &data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	/* Use 25MHz for both link down and 1000Base-T for Tx clock. */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	data |= GG82563_MSCR_TX_CLK_1000MBPS_25;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	ret_val = e1e_wphy(hw, GG82563_PHY_MAC_SPEC_CTRL, data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	 * Options:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	 *   MDI/MDI-X = 0 (default)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	 *   0 - Auto for all speeds
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	 *   1 - MDI mode
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	 *   2 - MDI-X mode
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	 *   3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
	ret_val = e1e_rphy(hw, GG82563_PHY_SPEC_CTRL, &data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	switch (phy->mdix) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	case 1:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
		data |= GG82563_PSCR_CROSSOVER_MODE_MDI;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	case 2:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
		data |= GG82563_PSCR_CROSSOVER_MODE_MDIX;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	case 0:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	default:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
		data |= GG82563_PSCR_CROSSOVER_MODE_AUTO;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
		break;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	 * Options:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	 *   disable_polarity_correction = 0 (default)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	 *       Automatic Correction for Reversed Cable Polarity
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	 *   0 - Disabled
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	 *   1 - Enabled
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
	if (phy->disable_polarity_correction)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
		data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL, data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	/* SW Reset the PHY so all changes take effect */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	ret_val = e1000e_commit_phy(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	if (ret_val) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
		e_dbg("Error Resetting the PHY\n");
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	/* Bypass Rx and Tx FIFO's */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
					E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
					E1000_KMRNCTRLSTA_FIFO_CTRL_RX_BYPASS |
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
					E1000_KMRNCTRLSTA_FIFO_CTRL_TX_BYPASS);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	ret_val = e1000_read_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
				       E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
				       &data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	data |= E1000_KMRNCTRLSTA_OPMODE_E_IDLE;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
					E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
					data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	ret_val = e1e_rphy(hw, GG82563_PHY_SPEC_CTRL_2, &data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	ret_val = e1e_wphy(hw, GG82563_PHY_SPEC_CTRL_2, data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	ctrl_ext = er32(CTRL_EXT);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	ctrl_ext &= ~(E1000_CTRL_EXT_LINK_MODE_MASK);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	ew32(CTRL_EXT, ctrl_ext);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	ret_val = e1e_rphy(hw, GG82563_PHY_PWR_MGMT_CTRL, &data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	 * Do not init these registers when the HW is in IAMT mode, since the
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	 * firmware will have already initialized them.  We only initialize
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	 * them if the HW is not in IAMT mode.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	if (!e1000e_check_mng_mode(hw)) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
		/* Enable Electrical Idle on the PHY */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
		data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
		ret_val = e1e_wphy(hw, GG82563_PHY_PWR_MGMT_CTRL, data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
		data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
		ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	 * Workaround: Disable padding in Kumeran interface in the MAC
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	 * and in the PHY to avoid CRC errors.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
	ret_val = e1e_rphy(hw, GG82563_PHY_INBAND_CTRL, &data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
	data |= GG82563_ICR_DIS_PADDING;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
	ret_val = e1e_wphy(hw, GG82563_PHY_INBAND_CTRL, data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
 *  e1000_setup_copper_link_80003es2lan - Setup Copper Link for ESB2
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
 *  Essentially a wrapper for setting up all things "copper" related.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
 *  This is a function pointer entry point called by the mac module.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	u32 ctrl;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	u16 reg_data;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	ctrl = er32(CTRL);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	ctrl |= E1000_CTRL_SLU;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	ew32(CTRL, ctrl);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	 * Set the mac to wait the maximum time between each
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	 * iteration and increase the max iterations when
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	 * polling the phy; this fixes erroneous timeouts at 10Mbps.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	ret_val = e1000_write_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 4),
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	                                           0xFFFF);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
	ret_val = e1000_read_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 9),
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	                                          &reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	reg_data |= 0x3F;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	ret_val = e1000_write_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 9),
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	                                           reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	ret_val = e1000_read_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
				      E1000_KMRNCTRLSTA_OFFSET_INB_CTRL,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
				      &reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	reg_data |= E1000_KMRNCTRLSTA_INB_CTRL_DIS_PADDING;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
					E1000_KMRNCTRLSTA_OFFSET_INB_CTRL,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
					reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	ret_val = e1000_copper_link_setup_gg82563_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
	ret_val = e1000e_setup_copper_link(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
 *  e1000_cfg_on_link_up_80003es2lan - es2 link configuration after link-up
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
 *  @duplex: current duplex setting
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
 *  Configure the KMRN interface by applying last minute quirks for
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
 *  10/100 operation.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
static s32 e1000_cfg_on_link_up_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
	s32 ret_val = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
	u16 speed;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	u16 duplex;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	if (hw->phy.media_type == e1000_media_type_copper) {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
		ret_val = e1000e_get_speed_and_duplex_copper(hw, &speed,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
		                                             &duplex);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
		if (speed == SPEED_1000)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
			ret_val = e1000_cfg_kmrn_1000_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
		else
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
			ret_val = e1000_cfg_kmrn_10_100_80003es2lan(hw, duplex);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
 *  e1000_cfg_kmrn_10_100_80003es2lan - Apply "quirks" for 10/100 operation
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
 *  @duplex: current duplex setting
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
 *  Configure the KMRN interface by applying last minute quirks for
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
 *  10/100 operation.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	u32 tipg;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	u32 i = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	u16 reg_data, reg_data2;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
	reg_data = E1000_KMRNCTRLSTA_HD_CTRL_10_100_DEFAULT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	                               E1000_KMRNCTRLSTA_OFFSET_HD_CTRL,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	                               reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	/* Configure Transmit Inter-Packet Gap */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	tipg = er32(TIPG);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	tipg &= ~E1000_TIPG_IPGT_MASK;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	tipg |= DEFAULT_TIPG_IPGT_10_100_80003ES2LAN;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	ew32(TIPG, tipg);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	do {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data2);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
		i++;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	} while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	if (duplex == HALF_DUPLEX)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
		reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	else
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
		reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
	return 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
 *  e1000_cfg_kmrn_1000_80003es2lan - Apply "quirks" for gigabit operation
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
 *  Configure the KMRN interface by applying last minute quirks for
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
 *  gigabit operation.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	s32 ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
	u16 reg_data, reg_data2;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	u32 tipg;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	u32 i = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	reg_data = E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	                               E1000_KMRNCTRLSTA_OFFSET_HD_CTRL,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	                               reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	/* Configure Transmit Inter-Packet Gap */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	tipg = er32(TIPG);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	tipg &= ~E1000_TIPG_IPGT_MASK;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	tipg |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
	ew32(TIPG, tipg);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	do {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		ret_val = e1e_rphy(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data2);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
			return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		i++;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	} while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY));
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
	ret_val = e1e_wphy(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
 *  e1000_read_kmrn_reg_80003es2lan - Read kumeran register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
 *  @offset: register offset to be read
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
 *  @data: pointer to the read data
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
 *  Acquire semaphore, then read the PHY register at offset
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
 *  using the kumeran interface.  The information retrieved is stored in data.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
 *  Release the semaphore before exiting.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
static s32 e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
					   u16 *data)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	u32 kmrnctrlsta;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	s32 ret_val = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	ret_val = e1000_acquire_mac_csr_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	               E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	ew32(KMRNCTRLSTA, kmrnctrlsta);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	udelay(2);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	kmrnctrlsta = er32(KMRNCTRLSTA);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	*data = (u16)kmrnctrlsta;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
	e1000_release_mac_csr_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
 *  e1000_write_kmrn_reg_80003es2lan - Write kumeran register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
 *  @offset: register offset to write to
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
 *  @data: data to write at register offset
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
 *  Acquire semaphore, then write the data to PHY register
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
 *  at the offset using the kumeran interface.  Release semaphore
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
 *  before exiting.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
static s32 e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
					    u16 data)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	u32 kmrnctrlsta;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	s32 ret_val = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
	ret_val = e1000_acquire_mac_csr_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
	kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
	               E1000_KMRNCTRLSTA_OFFSET) | data;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
	ew32(KMRNCTRLSTA, kmrnctrlsta);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
	udelay(2);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	e1000_release_mac_csr_80003es2lan(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
 *  e1000_read_mac_addr_80003es2lan - Read device MAC address
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
static s32 e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	s32 ret_val = 0;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
	/*
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	 * If there's an alternate MAC address place it in RAR0
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	 * so that it will override the Si installed default perm
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
	 * address.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
	 */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	ret_val = e1000_check_alt_mac_addr_generic(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	if (ret_val)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		goto out;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
	ret_val = e1000_read_mac_addr_generic(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
out:
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
	return ret_val;
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
 * e1000_power_down_phy_copper_80003es2lan - Remove link during PHY power down
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
 * @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
 * In the case of a PHY power down to save power, or to turn off link during a
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
 * driver unload, or wake on lan is not enabled, remove the link.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
static void e1000_power_down_phy_copper_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	/* If the management interface is not enabled, then power down */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	if (!(hw->mac.ops.check_mng_mode(hw) ||
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	      hw->phy.ops.check_reset_block(hw)))
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
		e1000_power_down_phy_copper(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
/**
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
 *  e1000_clear_hw_cntrs_80003es2lan - Clear device specific hardware counters
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
 *  @hw: pointer to the HW structure
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
 *
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
 *  Clears the hardware counters by reading the counter registers.
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
 **/
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw)
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
{
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	e1000e_clear_hw_cntrs_base(hw);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	er32(PRC64);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	er32(PRC127);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	er32(PRC255);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	er32(PRC511);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	er32(PRC1023);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	er32(PRC1522);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	er32(PTC64);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
	er32(PTC127);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	er32(PTC255);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	er32(PTC511);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	er32(PTC1023);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
	er32(PTC1522);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	er32(ALGNERRC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	er32(RXERRC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
	er32(TNCRS);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	er32(CEXTERR);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	er32(TSCTC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	er32(TSCTFC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
	er32(MGTPRC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
	er32(MGTPDC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
	er32(MGTPTC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
	er32(IAC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
	er32(ICRXOC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
	er32(ICRXPTC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
	er32(ICRXATC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	er32(ICTXPTC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	er32(ICTXATC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	er32(ICTXQEC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
	er32(ICTXQMTC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	er32(ICRXDMTC);
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
}
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
static struct e1000_mac_operations es2_mac_ops = {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
	.read_mac_addr		= e1000_read_mac_addr_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	.id_led_init		= e1000e_id_led_init,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
	.check_mng_mode		= e1000e_check_mng_mode_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	/* check_for_link dependent on media type */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
	.cleanup_led		= e1000e_cleanup_led_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	.clear_hw_cntrs		= e1000_clear_hw_cntrs_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	.get_bus_info		= e1000e_get_bus_info_pcie,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	.set_lan_id		= e1000_set_lan_id_multi_port_pcie,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
	.get_link_up_info	= e1000_get_link_up_info_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	.led_on			= e1000e_led_on_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	.led_off		= e1000e_led_off_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	.update_mc_addr_list	= e1000e_update_mc_addr_list_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
	.write_vfta		= e1000_write_vfta_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
	.clear_vfta		= e1000_clear_vfta_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	.reset_hw		= e1000_reset_hw_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
	.init_hw		= e1000_init_hw_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	.setup_link		= e1000e_setup_link,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	/* setup_physical_interface dependent on media type */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	.setup_led		= e1000e_setup_led_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
};
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
static struct e1000_phy_operations es2_phy_ops = {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
	.acquire		= e1000_acquire_phy_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	.check_polarity		= e1000_check_polarity_m88,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	.check_reset_block	= e1000e_check_reset_block_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	.commit		 	= e1000e_phy_sw_reset,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
	.force_speed_duplex 	= e1000_phy_force_speed_duplex_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
	.get_cfg_done       	= e1000_get_cfg_done_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	.get_cable_length   	= e1000_get_cable_length_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	.get_info       	= e1000e_get_phy_info_m88,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	.read_reg       	= e1000_read_phy_reg_gg82563_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	.release		= e1000_release_phy_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
	.reset		  	= e1000e_phy_hw_reset_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
	.set_d0_lplu_state  	= NULL,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
	.set_d3_lplu_state  	= e1000e_set_d3_lplu_state,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
	.write_reg      	= e1000_write_phy_reg_gg82563_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
	.cfg_on_link_up      	= e1000_cfg_on_link_up_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
};
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
static struct e1000_nvm_operations es2_nvm_ops = {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
	.acquire		= e1000_acquire_nvm_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
	.read			= e1000e_read_nvm_eerd,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
	.release		= e1000_release_nvm_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
	.update			= e1000e_update_nvm_checksum_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	.valid_led_default	= e1000e_valid_led_default,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	.validate		= e1000e_validate_nvm_checksum_generic,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	.write			= e1000_write_nvm_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
};
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
struct e1000_info e1000_es2_info = {
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	.mac			= e1000_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
	.flags			= FLAG_HAS_HW_VLAN_FILTER
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
				  | FLAG_HAS_JUMBO_FRAMES
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
				  | FLAG_HAS_WOL
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
				  | FLAG_APME_IN_CTRL3
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
				  | FLAG_RX_CSUM_ENABLED
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
				  | FLAG_HAS_CTRLEXT_ON_LOAD
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
				  | FLAG_RX_NEEDS_RESTART /* errata */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
				  | FLAG_TARC_SET_BIT_ZERO /* errata */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
				  | FLAG_APME_CHECK_PORT_B
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
				  | FLAG_DISABLE_FC_PAUSE_TIME /* errata */
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
				  | FLAG_TIPG_MEDIUM_FOR_80003ESLAN,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	.pba			= 38,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
	.max_hw_frame_size	= DEFAULT_JUMBO,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	.get_variants		= e1000_get_variants_80003es2lan,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	.mac_ops		= &es2_mac_ops,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	.phy_ops		= &es2_phy_ops,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
	.nvm_ops		= &es2_nvm_ops,
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
};
0a6fc3f5f418 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504