devices/e1000e/ich8lan-2.6.35-orig.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 2285 8ebecea534d3
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
2285
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2009 Intel Corporation.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
8ebecea534d3 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
8ebecea534d3 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,
8ebecea534d3 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.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
8ebecea534d3 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
8ebecea534d3 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
8ebecea534d3 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
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
8ebecea534d3 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
8ebecea534d3 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.,
8ebecea534d3 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.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
8ebecea534d3 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
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
8ebecea534d3 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>
8ebecea534d3 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
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 * 82562G 10/100 Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 * 82562G-2 10/100 Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 * 82562GT 10/100 Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
 * 82562GT-2 10/100 Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
 * 82562V 10/100 Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
 * 82562V-2 10/100 Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
 * 82566DC-2 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
 * 82566DC Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
 * 82566DM-2 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
 * 82566DM Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
 * 82566MC Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
 * 82566MM Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
 * 82567LM Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
 * 82567LF Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
 * 82567V Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
 * 82567LM-2 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
 * 82567LF-2 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
 * 82567V-2 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
 * 82567LF-3 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
 * 82567LM-3 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
 * 82567LM-4 Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
 * 82577LM Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
 * 82577LC Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
 * 82578DM Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
 * 82578DC Gigabit Network Connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
#include "e1000.h"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
#define ICH_FLASH_GFPREG		0x0000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
#define ICH_FLASH_HSFSTS		0x0004
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
#define ICH_FLASH_HSFCTL		0x0006
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
#define ICH_FLASH_FADDR			0x0008
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
#define ICH_FLASH_FDATA0		0x0010
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
#define ICH_FLASH_PR0			0x0074
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define ICH_FLASH_READ_COMMAND_TIMEOUT	500
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define ICH_FLASH_WRITE_COMMAND_TIMEOUT	500
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#define ICH_FLASH_ERASE_COMMAND_TIMEOUT	3000000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define ICH_FLASH_LINEAR_ADDR_MASK	0x00FFFFFF
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define ICH_FLASH_CYCLE_REPEAT_COUNT	10
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define ICH_CYCLE_READ			0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define ICH_CYCLE_WRITE			2
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define ICH_CYCLE_ERASE			3
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define FLASH_GFPREG_BASE_MASK		0x1FFF
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define FLASH_SECTOR_ADDR_SHIFT		12
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define ICH_FLASH_SEG_SIZE_256		256
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define ICH_FLASH_SEG_SIZE_4K		4096
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define ICH_FLASH_SEG_SIZE_8K		8192
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define ICH_FLASH_SEG_SIZE_64K		65536
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define E1000_ICH_FWSM_RSPCIPHY	0x00000040 /* Reset PHY on PCI Reset */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
/* FW established a valid mode */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define E1000_ICH_FWSM_FW_VALID		0x00008000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define E1000_ICH_MNG_IAMT_MODE		0x2
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define ID_LED_DEFAULT_ICH8LAN  ((ID_LED_DEF1_DEF2 << 12) | \
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
				 (ID_LED_DEF1_OFF2 <<  8) | \
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
				 (ID_LED_DEF1_ON2  <<  4) | \
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
				 (ID_LED_DEF1_DEF2))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
#define E1000_ICH_NVM_SIG_WORD		0x13
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
#define E1000_ICH_NVM_SIG_MASK		0xC000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
#define E1000_ICH_NVM_VALID_SIG_MASK    0xC0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
#define E1000_ICH_NVM_SIG_VALUE         0x80
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
#define E1000_ICH8_LAN_INIT_TIMEOUT	1500
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
#define E1000_FEXTNVM_SW_CONFIG		1
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
#define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
#define PCIE_ICH8_SNOOP_ALL		PCIE_NO_SNOOP_ALL
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
#define E1000_ICH_RAR_ENTRIES		7
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
#define PHY_PAGE_SHIFT 5
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
#define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
			   ((reg) & MAX_PHY_REG_ADDRESS))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
#define IGP3_KMRN_DIAG  PHY_REG(770, 19) /* KMRN Diagnostic */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
#define IGP3_VR_CTRL    PHY_REG(776, 18) /* Voltage Regulator Control */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
#define IGP3_KMRN_DIAG_PCS_LOCK_LOSS	0x0002
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
#define IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK 0x0300
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
#define IGP3_VR_CTRL_MODE_SHUTDOWN	0x0200
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
#define HV_LED_CONFIG		PHY_REG(768, 30) /* LED Configuration */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
#define SW_FLAG_TIMEOUT    1000 /* SW Semaphore flag timeout in milliseconds */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
/* SMBus Address Phy Register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
#define HV_SMB_ADDR            PHY_REG(768, 26)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
#define HV_SMB_ADDR_PEC_EN     0x0200
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
#define HV_SMB_ADDR_VALID      0x0080
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
/* Strapping Option Register - RO */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
#define E1000_STRAP                     0x0000C
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
#define E1000_STRAP_SMBUS_ADDRESS_MASK  0x00FE0000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
#define E1000_STRAP_SMBUS_ADDRESS_SHIFT 17
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
/* OEM Bits Phy Register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
#define HV_OEM_BITS            PHY_REG(768, 25)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
#define HV_OEM_BITS_LPLU       0x0004 /* Low Power Link Up */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
#define HV_OEM_BITS_GBE_DIS    0x0040 /* Gigabit Disable */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
#define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
#define E1000_NVM_K1_CONFIG 0x1B /* NVM K1 Config Word */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
#define E1000_NVM_K1_ENABLE 0x1  /* NVM Enable K1 bit */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
/* KMRN Mode Control */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
#define HV_KMRN_MODE_CTRL      PHY_REG(769, 16)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
#define HV_KMRN_MDIO_SLOW      0x0400
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
/* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
/* Offset 04h HSFSTS */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
union ich8_hws_flash_status {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	struct ich8_hsfsts {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
		u16 flcdone    :1; /* bit 0 Flash Cycle Done */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
		u16 flcerr     :1; /* bit 1 Flash Cycle Error */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
		u16 dael       :1; /* bit 2 Direct Access error Log */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
		u16 berasesz   :2; /* bit 4:3 Sector Erase Size */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
		u16 flcinprog  :1; /* bit 5 flash cycle in Progress */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
		u16 reserved1  :2; /* bit 13:6 Reserved */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
		u16 reserved2  :6; /* bit 13:6 Reserved */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
		u16 fldesvalid :1; /* bit 14 Flash Descriptor Valid */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
		u16 flockdn    :1; /* bit 15 Flash Config Lock-Down */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	} hsf_status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
	u16 regval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
/* ICH GbE Flash Hardware Sequencing Flash control Register bit breakdown */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
/* Offset 06h FLCTL */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
union ich8_hws_flash_ctrl {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	struct ich8_hsflctl {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
		u16 flcgo      :1;   /* 0 Flash Cycle Go */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
		u16 flcycle    :2;   /* 2:1 Flash Cycle */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
		u16 reserved   :5;   /* 7:3 Reserved  */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
		u16 fldbcount  :2;   /* 9:8 Flash Data Byte Count */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
		u16 flockdn    :6;   /* 15:10 Reserved */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
	} hsf_ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
	u16 regval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
/* ICH Flash Region Access Permissions */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
union ich8_hws_flash_regacc {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	struct ich8_flracc {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
		u32 grra      :8; /* 0:7 GbE region Read Access */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
		u32 grwa      :8; /* 8:15 GbE region Write Access */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
		u32 gmrag     :8; /* 23:16 GbE Master Read Access Grant */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
		u32 gmwag     :8; /* 31:24 GbE Master Write Access Grant */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	} hsf_flregacc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	u16 regval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
/* ICH Flash Protected Region */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
union ich8_flash_protected_range {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
	struct ich8_pr {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
		u32 base:13;     /* 0:12 Protected Range Base */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
		u32 reserved1:2; /* 13:14 Reserved */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
		u32 rpe:1;       /* 15 Read Protection Enable */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
		u32 limit:13;    /* 16:28 Protected Range Limit */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
		u32 reserved2:2; /* 29:30 Reserved */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
		u32 wpe:1;       /* 31 Write Protection Enable */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	} range;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	u32 regval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
static s32 e1000_retry_write_flash_byte_ich8lan(struct e1000_hw *hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
						u32 offset, u8 byte);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
static s32 e1000_read_flash_byte_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
					 u8 *data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
static s32 e1000_read_flash_word_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
					 u16 *data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
					 u8 size, u16 *data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
static s32 e1000_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
static s32 e1000_cleanup_led_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
static s32 e1000_led_on_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
static s32 e1000_led_off_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
static s32 e1000_setup_led_pchlan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
static s32 e1000_led_on_pchlan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
static s32 e1000_led_off_pchlan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
static void e1000_power_down_phy_copper_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
static s32  e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	return readw(hw->flash_address + reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
static inline u32 __er32flash(struct e1000_hw *hw, unsigned long reg)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	return readl(hw->flash_address + reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
static inline void __ew16flash(struct e1000_hw *hw, unsigned long reg, u16 val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	writew(val, hw->flash_address + reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
static inline void __ew32flash(struct e1000_hw *hw, unsigned long reg, u32 val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	writel(val, hw->flash_address + reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define er16flash(reg)		__er16flash(hw, (reg))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define er32flash(reg)		__er32flash(hw, (reg))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
#define ew16flash(reg,val)	__ew16flash(hw, (reg), (val))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
#define ew32flash(reg,val)	__ew32flash(hw, (reg), (val))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
 *  e1000_init_phy_params_pchlan - Initialize PHY function pointers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
 *  Initialize family-specific PHY parameters and function pointers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	struct e1000_phy_info *phy = &hw->phy;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	u32 ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	phy->addr                     = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	phy->reset_delay_us           = 100;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	phy->ops.read_reg             = e1000_read_phy_reg_hv;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	phy->ops.read_reg_locked      = e1000_read_phy_reg_hv_locked;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	phy->ops.set_d0_lplu_state    = e1000_set_lplu_state_pchlan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	phy->ops.set_d3_lplu_state    = e1000_set_lplu_state_pchlan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	phy->ops.write_reg            = e1000_write_phy_reg_hv;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	phy->ops.write_reg_locked     = e1000_write_phy_reg_hv_locked;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	phy->ops.power_up             = e1000_power_up_phy_copper;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	phy->ops.power_down           = e1000_power_down_phy_copper_ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	phy->autoneg_mask             = AUTONEG_ADVERTISE_SPEED_DEFAULT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	if (!(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
		 * The MAC-PHY interconnect may still be in SMBus mode
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
		 * after Sx->S0.  Toggle the LANPHYPC Value bit to force
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
		 * the interconnect to PCIe mode, but only if there is no
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
		 * firmware present otherwise firmware will have done it.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
		ctrl = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
		ctrl |=  E1000_CTRL_LANPHYPC_OVERRIDE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
		ctrl &= ~E1000_CTRL_LANPHYPC_VALUE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
		ew32(CTRL, ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
		udelay(10);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
		ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
		ew32(CTRL, ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
		msleep(50);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	 * Reset the PHY before any acccess to it.  Doing so, ensures that
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	 * the PHY is in a known good state before we read/write PHY registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	 * The generic reset is sufficient here, because we haven't determined
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	 * the PHY type yet.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	ret_val = e1000e_phy_hw_reset_generic(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	phy->id = e1000_phy_unknown;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	ret_val = e1000e_get_phy_id(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	if ((phy->id == 0) || (phy->id == PHY_REVISION_MASK)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
		 * In case the PHY needs to be in mdio slow mode (eg. 82577),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
		 * set slow mode and try to get the PHY id again.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
		ret_val = e1000_set_mdio_slow_mode_hv(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
		ret_val = e1000e_get_phy_id(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	phy->type = e1000e_get_phy_type_from_id(phy->id);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	switch (phy->type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	case e1000_phy_82577:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
		phy->ops.check_polarity = e1000_check_polarity_82577;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
		phy->ops.force_speed_duplex =
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
			e1000_phy_force_speed_duplex_82577;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
		phy->ops.get_cable_length = e1000_get_cable_length_82577;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
		phy->ops.get_info = e1000_get_phy_info_82577;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
		phy->ops.commit = e1000e_phy_sw_reset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	case e1000_phy_82578:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
		phy->ops.check_polarity = e1000_check_polarity_m88;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
		phy->ops.force_speed_duplex = e1000e_phy_force_speed_duplex_m88;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
		phy->ops.get_cable_length = e1000e_get_cable_length_m88;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
		phy->ops.get_info = e1000e_get_phy_info_m88;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
		ret_val = -E1000_ERR_PHY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
 *  e1000_init_phy_params_ich8lan - Initialize PHY function pointers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
 *  Initialize family-specific PHY parameters and function pointers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	struct e1000_phy_info *phy = &hw->phy;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	u16 i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	phy->addr			= 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	phy->reset_delay_us		= 100;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	phy->ops.power_up               = e1000_power_up_phy_copper;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	phy->ops.power_down             = e1000_power_down_phy_copper_ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	 * We may need to do this twice - once for IGP and if that fails,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	 * we'll set BM func pointers and try again
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	ret_val = e1000e_determine_phy_address(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	if (ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
		phy->ops.write_reg = e1000e_write_phy_reg_bm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
		phy->ops.read_reg  = e1000e_read_phy_reg_bm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
		ret_val = e1000e_determine_phy_address(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
		if (ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
			e_dbg("Cannot determine PHY addr. Erroring out\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	phy->id = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	while ((e1000_phy_unknown == e1000e_get_phy_type_from_id(phy->id)) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	       (i++ < 100)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
		msleep(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
		ret_val = e1000e_get_phy_id(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	/* Verify phy id */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	switch (phy->id) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	case IGP03E1000_E_PHY_ID:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
		phy->type = e1000_phy_igp_3;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
		phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
		phy->ops.read_reg_locked = e1000e_read_phy_reg_igp_locked;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
		phy->ops.write_reg_locked = e1000e_write_phy_reg_igp_locked;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
		phy->ops.get_info = e1000e_get_phy_info_igp;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
		phy->ops.check_polarity = e1000_check_polarity_igp;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
		phy->ops.force_speed_duplex = e1000e_phy_force_speed_duplex_igp;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	case IFE_E_PHY_ID:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	case IFE_PLUS_E_PHY_ID:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	case IFE_C_E_PHY_ID:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
		phy->type = e1000_phy_ife;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
		phy->autoneg_mask = E1000_ALL_NOT_GIG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
		phy->ops.get_info = e1000_get_phy_info_ife;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
		phy->ops.check_polarity = e1000_check_polarity_ife;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
		phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_ife;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	case BME1000_E_PHY_ID:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
		phy->type = e1000_phy_bm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
		phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
		phy->ops.read_reg = e1000e_read_phy_reg_bm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
		phy->ops.write_reg = e1000e_write_phy_reg_bm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
		phy->ops.commit = e1000e_phy_sw_reset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
		phy->ops.get_info = e1000e_get_phy_info_m88;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
		phy->ops.check_polarity = e1000_check_polarity_m88;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
		phy->ops.force_speed_duplex = e1000e_phy_force_speed_duplex_m88;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
		return -E1000_ERR_PHY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
 *  e1000_init_nvm_params_ich8lan - Initialize NVM function pointers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
 *  Initialize family-specific NVM parameters and function
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
 *  pointers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	struct e1000_nvm_info *nvm = &hw->nvm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	u32 gfpreg, sector_base_addr, sector_end_addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	u16 i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	/* Can't read flash registers if the register set isn't mapped. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	if (!hw->flash_address) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
		e_dbg("ERROR: Flash registers not mapped\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
		return -E1000_ERR_CONFIG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	nvm->type = e1000_nvm_flash_sw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	gfpreg = er32flash(ICH_FLASH_GFPREG);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	 * sector_X_addr is a "sector"-aligned address (4096 bytes)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	 * Add 1 to sector_end_addr since this sector is included in
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	 * the overall size.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	sector_base_addr = gfpreg & FLASH_GFPREG_BASE_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	sector_end_addr = ((gfpreg >> 16) & FLASH_GFPREG_BASE_MASK) + 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	/* flash_base_addr is byte-aligned */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	nvm->flash_base_addr = sector_base_addr << FLASH_SECTOR_ADDR_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	 * find total size of the NVM, then cut in half since the total
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	 * size represents two separate NVM banks.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	nvm->flash_bank_size = (sector_end_addr - sector_base_addr)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
				<< FLASH_SECTOR_ADDR_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	nvm->flash_bank_size /= 2;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	/* Adjust to word count */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	nvm->flash_bank_size /= sizeof(u16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	nvm->word_size = E1000_ICH8_SHADOW_RAM_WORDS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	/* Clear shadow ram */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	for (i = 0; i < nvm->word_size; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
		dev_spec->shadow_ram[i].modified = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
		dev_spec->shadow_ram[i].value    = 0xFFFF;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
 *  e1000_init_mac_params_ich8lan - Initialize MAC function pointers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
 *  Initialize family-specific MAC parameters and function
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
 *  pointers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	struct e1000_mac_info *mac = &hw->mac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	/* Set media type function pointer */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	hw->phy.media_type = e1000_media_type_copper;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	/* Set mta register count */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	mac->mta_reg_count = 32;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	/* Set rar entry count */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	mac->rar_entry_count = E1000_ICH_RAR_ENTRIES;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	if (mac->type == e1000_ich8lan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
		mac->rar_entry_count--;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	/* FWSM register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	mac->has_fwsm = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	/* ARC subsystem not supported */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	mac->arc_subsystem_valid = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	/* Adaptive IFS supported */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
	mac->adaptive_ifs = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	/* LED operations */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	switch (mac->type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	case e1000_ich8lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	case e1000_ich9lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	case e1000_ich10lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
		/* ID LED init */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
		mac->ops.id_led_init = e1000e_id_led_init;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
		/* setup LED */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
		mac->ops.setup_led = e1000e_setup_led_generic;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
		/* cleanup LED */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
		mac->ops.cleanup_led = e1000_cleanup_led_ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
		/* turn on/off LED */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
		mac->ops.led_on = e1000_led_on_ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
		mac->ops.led_off = e1000_led_off_ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	case e1000_pchlan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
		/* ID LED init */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
		mac->ops.id_led_init = e1000_id_led_init_pchlan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
		/* setup LED */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
		mac->ops.setup_led = e1000_setup_led_pchlan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
		/* cleanup LED */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
		mac->ops.cleanup_led = e1000_cleanup_led_pchlan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		/* turn on/off LED */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
		mac->ops.led_on = e1000_led_on_pchlan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		mac->ops.led_off = e1000_led_off_pchlan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	/* Enable PCS Lock-loss workaround for ICH8 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	if (mac->type == e1000_ich8lan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw, true);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
 *  e1000_check_for_copper_link_ich8lan - Check for link (Copper)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
 *  Checks to see of the link status of the hardware has changed.  If a
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
 *  change in link status has been detected, then we read the PHY registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
 *  to get the current speed/duplex if link exists.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
	struct e1000_mac_info *mac = &hw->mac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
	bool link;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	 * We only want to go out to the PHY registers to see if Auto-Neg
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
	 * has completed and/or if our link status has changed.  The
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	 * get_link_status flag is set upon receiving a Link Status
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	 * Change or Rx Sequence Error interrupt.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	if (!mac->get_link_status) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
		ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	 * First we want to see if the MII Status Register reports
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	 * link.  If so, then we want to get the current speed/duplex
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	 * of the PHY.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	if (hw->mac.type == e1000_pchlan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
		ret_val = e1000_k1_gig_workaround_hv(hw, link);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	if (!link)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
		goto out; /* No link detected */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	mac->get_link_status = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	if (hw->phy.type == e1000_phy_82578) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
		ret_val = e1000_link_stall_workaround_hv(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	 * Check if there was DownShift, must be checked
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	 * immediately after link-up
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	e1000e_check_downshift(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	 * If we are forcing speed/duplex, then we simply return since
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	 * we have already determined whether we have link or not.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	if (!mac->autoneg) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
		ret_val = -E1000_ERR_CONFIG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	 * Auto-Neg is enabled.  Auto Speed Detection takes care
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	 * of MAC speed/duplex configuration.  So we only need to
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	 * configure Collision Distance in the MAC.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	e1000e_config_collision_dist(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	 * Configure Flow Control now that Auto-Neg has completed.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	 * First, we need to restore the desired flow control
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	 * settings because we may have had to re-autoneg with a
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
	 * different link partner.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	ret_val = e1000e_config_fc_after_link_up(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
		e_dbg("Error configuring flow control\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	s32 rc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	rc = e1000_init_mac_params_ich8lan(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	if (rc)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		return rc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	rc = e1000_init_nvm_params_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	if (rc)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
		return rc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
	if (hw->mac.type == e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
		rc = e1000_init_phy_params_pchlan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
		rc = e1000_init_phy_params_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	if (rc)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
		return rc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	if (adapter->hw.phy.type == e1000_phy_ife) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
		adapter->flags &= ~FLAG_HAS_JUMBO_FRAMES;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
		adapter->max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
	if ((adapter->hw.mac.type == e1000_ich8lan) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
	    (adapter->hw.phy.type == e1000_phy_igp_3))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
		adapter->flags |= FLAG_LSC_GIG_SPEED_DROP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
static DEFINE_MUTEX(nvm_mutex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
 *  e1000_acquire_nvm_ich8lan - Acquire NVM mutex
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
 *  Acquires the mutex for performing NVM operations.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
static s32 e1000_acquire_nvm_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	mutex_lock(&nvm_mutex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
 *  e1000_release_nvm_ich8lan - Release NVM mutex
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
 *  Releases the mutex used while performing NVM operations.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
static void e1000_release_nvm_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	mutex_unlock(&nvm_mutex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
static DEFINE_MUTEX(swflag_mutex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
 *  e1000_acquire_swflag_ich8lan - Acquire software control flag
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
 *  Acquires the software control flag for performing PHY and select
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
 *  MAC CSR accesses.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	u32 extcnf_ctrl, timeout = PHY_CFG_TIMEOUT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
	mutex_lock(&swflag_mutex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	while (timeout) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
		extcnf_ctrl = er32(EXTCNF_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
		if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
		mdelay(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
		timeout--;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	if (!timeout) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
		e_dbg("SW/FW/HW has locked the resource for too long.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
		ret_val = -E1000_ERR_CONFIG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	timeout = SW_FLAG_TIMEOUT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	ew32(EXTCNF_CTRL, extcnf_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	while (timeout) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		extcnf_ctrl = er32(EXTCNF_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		mdelay(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		timeout--;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	if (!timeout) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
		e_dbg("Failed to acquire the semaphore.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
		ew32(EXTCNF_CTRL, extcnf_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		ret_val = -E1000_ERR_CONFIG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		mutex_unlock(&swflag_mutex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
 *  e1000_release_swflag_ich8lan - Release software control flag
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
 *  Releases the software control flag for performing PHY and select
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
 *  MAC CSR accesses.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
static void e1000_release_swflag_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
	u32 extcnf_ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	extcnf_ctrl = er32(EXTCNF_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	ew32(EXTCNF_CTRL, extcnf_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	mutex_unlock(&swflag_mutex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
 *  e1000_check_mng_mode_ich8lan - Checks management mode
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
 *  This checks if the adapter has manageability enabled.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
 *  This is a function pointer entry point only called by read/write
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
 *  routines for the PHY and NVM parts.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	u32 fwsm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	fwsm = er32(FWSM);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	return (fwsm & E1000_FWSM_MODE_MASK) ==
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		(E1000_ICH_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
 *  e1000_check_reset_block_ich8lan - Check if PHY reset is blocked
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
 *  Checks if firmware is blocking the reset of the PHY.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
 *  This is a function pointer entry point only called by
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
 *  reset routines.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	u32 fwsm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	fwsm = er32(FWSM);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	return (fwsm & E1000_ICH_FWSM_RSPCIPHY) ? 0 : E1000_BLK_PHY_RESET;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
 *  e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
 *  @hw:   pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
 *  SW should configure the LCD from the NVM extended configuration region
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
 *  as a workaround for certain parts.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	struct e1000_adapter *adapter = hw->adapter;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	struct e1000_phy_info *phy = &hw->phy;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	u16 word_addr, reg_data, reg_addr, phy_page = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	if (!(hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
		!(hw->mac.type == e1000_pchlan))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	ret_val = hw->phy.ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
	 * Initialize the PHY from the NVM on ICH platforms.  This
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	 * is needed due to an issue where the NVM configuration is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	 * not properly autoloaded after power transitions.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	 * Therefore, after each PHY reset, we will load the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	 * configuration data out of the NVM manually.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	if ((adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M_AMT) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	    (adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	    (hw->mac.type == e1000_pchlan))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
		sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	data = er32(FEXTNVM);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
	if (!(data & sw_cfg_mask))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
	 * Make sure HW does not configure LCD from PHY
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
	 * extended configuration before SW configuration
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	data = er32(EXTCNF_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
	cnf_size = er32(EXTCNF_SIZE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
	cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
	if (!cnf_size)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	if (!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	    (hw->mac.type == e1000_pchlan)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		 * HW configures the SMBus address and LEDs when the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
		 * OEM and LCD Write Enable bits are set in the NVM.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		 * When both NVM bits are cleared, SW will configure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		 * them instead.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		data = er32(STRAP);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
		data &= E1000_STRAP_SMBUS_ADDRESS_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		reg_data = data >> E1000_STRAP_SMBUS_ADDRESS_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		reg_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
							reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
		data = er32(LEDCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
		ret_val = e1000_write_phy_reg_hv_locked(hw, HV_LED_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
							(u16)data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	/* Configure LCD from extended configuration region. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	/* cnf_base_addr is in DWORD */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	word_addr = (u16)(cnf_base_addr << 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	for (i = 0; i < cnf_size; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
		ret_val = e1000_read_nvm(hw, (word_addr + i * 2), 1,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
					 &reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
		ret_val = e1000_read_nvm(hw, (word_addr + i * 2 + 1),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
					 1, &reg_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
		/* Save off the PHY page for future writes. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
		if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
			phy_page = reg_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
			continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
		reg_addr &= PHY_REG_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
		reg_addr |= phy_page;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
		ret_val = phy->ops.write_reg_locked(hw, (u32)reg_addr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
						    reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	hw->phy.ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
 *  e1000_k1_gig_workaround_hv - K1 Si workaround
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
 *  @hw:   pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
 *  @link: link up bool flag
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
 *  If K1 is enabled for 1Gbps, the MAC might stall when transitioning
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
 *  from a lower speed.  This workaround disables K1 whenever link is at 1Gig
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
 *  If link is down, the function will restore the default K1 setting located
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
 *  in the NVM.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	u16 status_reg = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	bool k1_enable = hw->dev_spec.ich8lan.nvm_k1_enabled;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	if (hw->mac.type != e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
	/* Wrap the whole flow with the sw flag */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	ret_val = hw->phy.ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	/* Disable K1 when link is 1Gbps, otherwise use the NVM setting */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	if (link) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
		if (hw->phy.type == e1000_phy_82578) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
			ret_val = hw->phy.ops.read_reg_locked(hw, BM_CS_STATUS,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
			                                          &status_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
				goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
			status_reg &= BM_CS_STATUS_LINK_UP |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
			              BM_CS_STATUS_RESOLVED |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
			              BM_CS_STATUS_SPEED_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
			if (status_reg == (BM_CS_STATUS_LINK_UP |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
			                   BM_CS_STATUS_RESOLVED |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
			                   BM_CS_STATUS_SPEED_1000))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
				k1_enable = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		if (hw->phy.type == e1000_phy_82577) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
			ret_val = hw->phy.ops.read_reg_locked(hw, HV_M_STATUS,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
			                                          &status_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
				goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
			status_reg &= HV_M_STATUS_LINK_UP |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
			              HV_M_STATUS_AUTONEG_COMPLETE |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
			              HV_M_STATUS_SPEED_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
			if (status_reg == (HV_M_STATUS_LINK_UP |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
			                   HV_M_STATUS_AUTONEG_COMPLETE |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
			                   HV_M_STATUS_SPEED_1000))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
				k1_enable = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
		/* Link stall fix for link up */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
		ret_val = hw->phy.ops.write_reg_locked(hw, PHY_REG(770, 19),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
		                                           0x0100);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
			goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
		/* Link stall fix for link down */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		ret_val = hw->phy.ops.write_reg_locked(hw, PHY_REG(770, 19),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
		                                           0x4100);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
			goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	ret_val = e1000_configure_k1_ich8lan(hw, k1_enable);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
release:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	hw->phy.ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
 *  e1000_configure_k1_ich8lan - Configure K1 power state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
 *  @enable: K1 state to configure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
 *  Configure the K1 power state based on the provided parameter.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
 *  Assumes semaphore already acquired.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
 *  Success returns 0, Failure returns -E1000_ERR_PHY (-2)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	u32 ctrl_reg = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	u32 ctrl_ext = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	u32 reg = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	u16 kmrn_reg = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	ret_val = e1000e_read_kmrn_reg_locked(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	                                     E1000_KMRNCTRLSTA_K1_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	                                     &kmrn_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	if (k1_enable)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
		kmrn_reg |= E1000_KMRNCTRLSTA_K1_ENABLE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
		kmrn_reg &= ~E1000_KMRNCTRLSTA_K1_ENABLE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
	ret_val = e1000e_write_kmrn_reg_locked(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	                                      E1000_KMRNCTRLSTA_K1_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	                                      kmrn_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	udelay(20);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	ctrl_ext = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	ctrl_reg = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	reg = ctrl_reg & ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	reg |= E1000_CTRL_FRCSPD;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	ew32(CTRL, reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	udelay(20);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	ew32(CTRL, ctrl_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	ew32(CTRL_EXT, ctrl_ext);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	udelay(20);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
 *  e1000_oem_bits_config_ich8lan - SW-based LCD Configuration
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
 *  @hw:       pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
 *  @d0_state: boolean if entering d0 or d3 device state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
 *  SW will configure Gbe Disable and LPLU based on the NVM. The four bits are
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
 *  collectively called OEM bits.  The OEM Write Enable bit and SW Config bit
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
 *  in NVM determines whether HW should configure LPLU and Gbe Disable.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	u32 mac_reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	u16 oem_reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	if (hw->mac.type != e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	ret_val = hw->phy.ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	mac_reg = er32(EXTCNF_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	if (mac_reg & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	mac_reg = er32(FEXTNVM);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	if (!(mac_reg & E1000_FEXTNVM_SW_CONFIG_ICH8M))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	mac_reg = er32(PHY_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	ret_val = hw->phy.ops.read_reg_locked(hw, HV_OEM_BITS, &oem_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	oem_reg &= ~(HV_OEM_BITS_GBE_DIS | HV_OEM_BITS_LPLU);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	if (d0_state) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
		if (mac_reg & E1000_PHY_CTRL_GBE_DISABLE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
			oem_reg |= HV_OEM_BITS_GBE_DIS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
		if (mac_reg & E1000_PHY_CTRL_D0A_LPLU)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
			oem_reg |= HV_OEM_BITS_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
		if (mac_reg & E1000_PHY_CTRL_NOND0A_GBE_DISABLE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
			oem_reg |= HV_OEM_BITS_GBE_DIS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
		if (mac_reg & E1000_PHY_CTRL_NOND0A_LPLU)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
			oem_reg |= HV_OEM_BITS_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
	/* Restart auto-neg to activate the bits */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
	if (!e1000_check_reset_block(hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
		oem_reg |= HV_OEM_BITS_RESTART_AN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	ret_val = hw->phy.ops.write_reg_locked(hw, HV_OEM_BITS, oem_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	hw->phy.ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
 *  e1000_set_mdio_slow_mode_hv - Set slow MDIO access mode
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
 *  @hw:   pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	u16 data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	ret_val = e1e_rphy(hw, HV_KMRN_MODE_CTRL, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	data |= HV_KMRN_MDIO_SLOW;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	ret_val = e1e_wphy(hw, HV_KMRN_MODE_CTRL, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
 *  e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
 *  done after every PHY reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	u16 phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	if (hw->mac.type != e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	/* Set MDIO slow mode before any other MDIO access */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
	if (hw->phy.type == e1000_phy_82577) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
		ret_val = e1000_set_mdio_slow_mode_hv(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	if (((hw->phy.type == e1000_phy_82577) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	     ((hw->phy.revision == 1) || (hw->phy.revision == 2))) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	    ((hw->phy.type == e1000_phy_82578) && (hw->phy.revision == 1))) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
		/* Disable generation of early preamble */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
		ret_val = e1e_wphy(hw, PHY_REG(769, 25), 0x4431);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
		/* Preamble tuning for SSC */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
		ret_val = e1e_wphy(hw, PHY_REG(770, 16), 0xA204);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	if (hw->phy.type == e1000_phy_82578) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
		 * Return registers to default by doing a soft reset then
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
		 * writing 0x3140 to the control register.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
		if (hw->phy.revision < 2) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
			e1000e_phy_sw_reset(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
			ret_val = e1e_wphy(hw, PHY_CONTROL, 0x3140);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	/* Select page 0 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	ret_val = hw->phy.ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	hw->phy.addr = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	hw->phy.ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	 * Configure the K1 Si workaround during phy reset assuming there is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	 * link so that it disables K1 if link is in 1Gbps.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	ret_val = e1000_k1_gig_workaround_hv(hw, true);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	/* Workaround for link disconnects on a busy hub in half duplex */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	ret_val = hw->phy.ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	ret_val = hw->phy.ops.read_reg_locked(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	                                      PHY_REG(BM_PORT_CTRL_PAGE, 17),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	                                      &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	ret_val = hw->phy.ops.write_reg_locked(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	                                       PHY_REG(BM_PORT_CTRL_PAGE, 17),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	                                       phy_data & 0x00FF);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
release:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	hw->phy.ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
 *  e1000_lan_init_done_ich8lan - Check for PHY config completion
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
 *  Check the appropriate indication the MAC has finished configuring the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
 *  PHY after a software reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	u32 data, loop = E1000_ICH8_LAN_INIT_TIMEOUT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	/* Wait for basic configuration completes before proceeding */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	do {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
		data = er32(STATUS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
		data &= E1000_STATUS_LAN_INIT_DONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
		udelay(100);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
	} while ((!data) && --loop);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	 * If basic configuration is incomplete before the above loop
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	 * count reaches 0, loading the configuration from NVM will
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	 * leave the PHY in a bad state possibly resulting in no link.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	if (loop == 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
		e_dbg("LAN_INIT_DONE not set, increase timeout\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
	/* Clear the Init Done bit for the next init event */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	data = er32(STATUS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
	data &= ~E1000_STATUS_LAN_INIT_DONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	ew32(STATUS, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
 *  e1000_post_phy_reset_ich8lan - Perform steps required after a PHY reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	u16 reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	if (e1000_check_reset_block(hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	/* Perform any necessary post-reset workarounds */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	switch (hw->mac.type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	case e1000_pchlan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	/* Dummy read to clear the phy wakeup bit after lcd reset */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	if (hw->mac.type == e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		e1e_rphy(hw, BM_WUC, &reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	/* Configure the LCD with the extended configuration region in NVM */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
	ret_val = e1000_sw_lcd_config_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	/* Configure the LCD with the OEM bits in NVM */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	ret_val = e1000_oem_bits_config_ich8lan(hw, true);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
 *  e1000_phy_hw_reset_ich8lan - Performs a PHY reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
 *  Resets the PHY
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
 *  This is a function pointer entry point called by drivers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
 *  or other shared routines.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	ret_val = e1000e_phy_hw_reset_generic(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	ret_val = e1000_post_phy_reset_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
 *  e1000_set_lplu_state_pchlan - Set Low Power Link Up state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
 *  @active: true to enable LPLU, false to disable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
 *  Sets the LPLU state according to the active flag.  For PCH, if OEM write
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
 *  bit are disabled in the NVM, writing the LPLU bits in the MAC will not set
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
 *  the phy speed. This function will manually set the LPLU bit and restart
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
 *  auto-neg as hw would do. D3 and D0 LPLU will call the same function
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
 *  since it configures the same bit.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	u16 oem_reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	ret_val = e1e_rphy(hw, HV_OEM_BITS, &oem_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
	if (active)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		oem_reg |= HV_OEM_BITS_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		oem_reg &= ~HV_OEM_BITS_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
	oem_reg |= HV_OEM_BITS_RESTART_AN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
	ret_val = e1e_wphy(hw, HV_OEM_BITS, oem_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
 *  e1000_set_d0_lplu_state_ich8lan - Set Low Power Linkup D0 state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
 *  @active: true to enable LPLU, false to disable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
 *  Sets the LPLU D0 state according to the active flag.  When
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
 *  activating LPLU this function also disables smart speed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
 *  and vice versa.  LPLU will not be activated unless the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
 *  device autonegotiation advertisement meets standards of
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
 *  either 10 or 10/100 or 10/100/1000 at all duplexes.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
 *  This is a function pointer entry point only called by
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
 *  PHY setup routines.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	struct e1000_phy_info *phy = &hw->phy;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	u32 phy_ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
	u16 data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	if (phy->type == e1000_phy_ife)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	phy_ctrl = er32(PHY_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	if (active) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
		phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		ew32(PHY_CTRL, phy_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		if (phy->type != e1000_phy_igp_3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		 * Call gig speed drop workaround on LPLU before accessing
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
		 * any PHY registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
		if (hw->mac.type == e1000_ich8lan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
			e1000e_gig_downshift_workaround_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
		/* When LPLU is enabled, we should disable SmartSpeed */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
		ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
		data &= ~IGP01E1000_PSCFR_SMART_SPEED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
		phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
		ew32(PHY_CTRL, phy_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
		if (phy->type != e1000_phy_igp_3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		 * LPLU and SmartSpeed are mutually exclusive.  LPLU is used
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		 * during Dx states where the power conservation is most
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		 * important.  During driver activity we should enable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		 * SmartSpeed, so performance is maintained.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		if (phy->smart_speed == e1000_smart_speed_on) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
			ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
					   &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
			data |= IGP01E1000_PSCFR_SMART_SPEED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
			ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
					   data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		} else if (phy->smart_speed == e1000_smart_speed_off) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
			ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
					   &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
			data &= ~IGP01E1000_PSCFR_SMART_SPEED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
			ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
					   data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
 *  e1000_set_d3_lplu_state_ich8lan - Set Low Power Linkup D3 state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
 *  @active: true to enable LPLU, false to disable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
 *  Sets the LPLU D3 state according to the active flag.  When
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
 *  activating LPLU this function also disables smart speed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
 *  and vice versa.  LPLU will not be activated unless the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
 *  device autonegotiation advertisement meets standards of
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
 *  either 10 or 10/100 or 10/100/1000 at all duplexes.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
 *  This is a function pointer entry point only called by
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
 *  PHY setup routines.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	struct e1000_phy_info *phy = &hw->phy;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
	u32 phy_ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	u16 data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
	phy_ctrl = er32(PHY_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
	if (!active) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		ew32(PHY_CTRL, phy_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		if (phy->type != e1000_phy_igp_3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
		 * LPLU and SmartSpeed are mutually exclusive.  LPLU is used
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		 * during Dx states where the power conservation is most
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		 * important.  During driver activity we should enable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		 * SmartSpeed, so performance is maintained.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		if (phy->smart_speed == e1000_smart_speed_on) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
			ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
					   &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
			data |= IGP01E1000_PSCFR_SMART_SPEED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
			ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
					   data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		} else if (phy->smart_speed == e1000_smart_speed_off) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
			ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
					   &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
			data &= ~IGP01E1000_PSCFR_SMART_SPEED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
			ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
					   data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	} else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		   (phy->autoneg_advertised == E1000_ALL_NOT_GIG) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		   (phy->autoneg_advertised == E1000_ALL_10_SPEED)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
		phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
		ew32(PHY_CTRL, phy_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		if (phy->type != e1000_phy_igp_3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		 * Call gig speed drop workaround on LPLU before accessing
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		 * any PHY registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		if (hw->mac.type == e1000_ich8lan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
			e1000e_gig_downshift_workaround_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		/* When LPLU is enabled, we should disable SmartSpeed */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		data &= ~IGP01E1000_PSCFR_SMART_SPEED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
 *  e1000_valid_nvm_bank_detect_ich8lan - finds out the valid bank 0 or 1
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
 *  @bank:  pointer to the variable that returns the active bank
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
 *  Reads signature byte from the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
 *  Word 0x13 bits 15:14 = 10b indicate a valid signature for that bank.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
	u32 eecd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
	struct e1000_nvm_info *nvm = &hw->nvm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
	u32 bank1_offset = nvm->flash_bank_size * sizeof(u16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
	u32 act_offset = E1000_ICH_NVM_SIG_WORD * 2 + 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	u8 sig_byte = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
	switch (hw->mac.type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	case e1000_ich8lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	case e1000_ich9lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
		eecd = er32(EECD);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
		if ((eecd & E1000_EECD_SEC1VAL_VALID_MASK) ==
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
		    E1000_EECD_SEC1VAL_VALID_MASK) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
			if (eecd & E1000_EECD_SEC1VAL)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
				*bank = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
			else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
				*bank = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		e_dbg("Unable to determine valid NVM bank via EEC - "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		       "reading flash signature\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		/* fall-thru */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		/* set bank to 0 in case flash read fails */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		*bank = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		/* Check bank 0 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		ret_val = e1000_read_flash_byte_ich8lan(hw, act_offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		                                        &sig_byte);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		if ((sig_byte & E1000_ICH_NVM_VALID_SIG_MASK) ==
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		    E1000_ICH_NVM_SIG_VALUE) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
			*bank = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		/* Check bank 1 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		ret_val = e1000_read_flash_byte_ich8lan(hw, act_offset +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		                                        bank1_offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		                                        &sig_byte);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		if ((sig_byte & E1000_ICH_NVM_VALID_SIG_MASK) ==
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
		    E1000_ICH_NVM_SIG_VALUE) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
			*bank = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		e_dbg("ERROR: No valid NVM bank present\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		return -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
 *  e1000_read_nvm_ich8lan - Read word(s) from the NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
 *  @offset: The offset (in bytes) of the word(s) to read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
 *  @words: Size of data to read in words
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
 *  @data: Pointer to the word(s) to read at offset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
 *  Reads a word(s) from the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
				  u16 *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	struct e1000_nvm_info *nvm = &hw->nvm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	u32 act_offset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	u32 bank = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	u16 i, word;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
	if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	    (words == 0)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
		e_dbg("nvm parameter(s) out of bounds\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
		ret_val = -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	nvm->ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	if (ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
		e_dbg("Could not detect valid bank, assuming bank 0\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
		bank = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	act_offset = (bank) ? nvm->flash_bank_size : 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	act_offset += offset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	for (i = 0; i < words; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
		if ((dev_spec->shadow_ram) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		    (dev_spec->shadow_ram[offset+i].modified)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
			data[i] = dev_spec->shadow_ram[offset+i].value;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
			ret_val = e1000_read_flash_word_ich8lan(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
								act_offset + i,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
								&word);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
			data[i] = word;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	nvm->ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		e_dbg("NVM read error: %d\n", ret_val);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
 *  e1000_flash_cycle_init_ich8lan - Initialize flash
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
 *  This function does initial flash setup so that a new read/write/erase cycle
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
 *  can be started.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	union ich8_hws_flash_status hsfsts;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
	s32 ret_val = -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
	s32 i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
	/* Check if the flash descriptor is valid */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
	if (hsfsts.hsf_status.fldesvalid == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		e_dbg("Flash descriptor invalid.  "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
			 "SW Sequencing must be used.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		return -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
	/* Clear FCERR and DAEL in hw status by writing 1 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	hsfsts.hsf_status.flcerr = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	hsfsts.hsf_status.dael = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	ew16flash(ICH_FLASH_HSFSTS, hsfsts.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	 * Either we should have a hardware SPI cycle in progress
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	 * bit to check against, in order to start a new cycle or
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	 * FDONE bit should be changed in the hardware so that it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	 * is 1 after hardware reset, which can then be used as an
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
	 * indication whether a cycle is in progress or has been
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	 * completed.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
	if (hsfsts.hsf_status.flcinprog == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		 * There is no cycle running at present,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		 * so we can start a cycle.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		 * Begin by setting Flash Cycle Done.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		hsfsts.hsf_status.flcdone = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		ew16flash(ICH_FLASH_HSFSTS, hsfsts.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
		ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		 * Otherwise poll for sometime so the current
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		 * cycle has a chance to end before giving up.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
		for (i = 0; i < ICH_FLASH_READ_COMMAND_TIMEOUT; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
			hsfsts.regval = __er16flash(hw, ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
			if (hsfsts.hsf_status.flcinprog == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
				ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
			udelay(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
		if (ret_val == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
			 * Successful in waiting for previous cycle to timeout,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
			 * now set the Flash Cycle Done.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
			hsfsts.hsf_status.flcdone = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
			ew16flash(ICH_FLASH_HSFSTS, hsfsts.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
			e_dbg("Flash controller busy, cannot get access\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
 *  e1000_flash_cycle_ich8lan - Starts flash cycle (read/write/erase)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
 *  @timeout: maximum time to wait for completion
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
 *  This function starts a flash cycle and waits for its completion.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	union ich8_hws_flash_ctrl hsflctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	union ich8_hws_flash_status hsfsts;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	s32 ret_val = -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	u32 i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
	/* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
	hsflctl.regval = er16flash(ICH_FLASH_HSFCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	hsflctl.hsf_ctrl.flcgo = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	ew16flash(ICH_FLASH_HSFCTL, hsflctl.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	/* wait till FDONE bit is set to 1 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
	do {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
		hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		if (hsfsts.hsf_status.flcdone == 1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		udelay(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	} while (i++ < timeout);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	if (hsfsts.hsf_status.flcdone == 1 && hsfsts.hsf_status.flcerr == 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
 *  e1000_read_flash_word_ich8lan - Read word from flash
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
 *  @offset: offset to data location
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
 *  @data: pointer to the location for storing the data
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
 *  Reads the flash word at offset into data.  Offset is converted
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
 *  to bytes before read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
static s32 e1000_read_flash_word_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
					 u16 *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	/* Must convert offset into bytes. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	offset <<= 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	return e1000_read_flash_data_ich8lan(hw, offset, 2, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
 *  e1000_read_flash_byte_ich8lan - Read byte from flash
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
 *  @offset: The offset of the byte to read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
 *  @data: Pointer to a byte to store the value read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
 *  Reads a single byte from the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
static s32 e1000_read_flash_byte_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
					 u8 *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
	u16 word = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	ret_val = e1000_read_flash_data_ich8lan(hw, offset, 1, &word);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
	*data = (u8)word;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
 *  e1000_read_flash_data_ich8lan - Read byte or word from NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
 *  @offset: The offset (in bytes) of the byte or word to read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
 *  @size: Size of data to read, 1=byte 2=word
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
 *  @data: Pointer to the word to store the value read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
 *  Reads a byte or word from the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
static s32 e1000_read_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
					 u8 size, u16 *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	union ich8_hws_flash_status hsfsts;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	union ich8_hws_flash_ctrl hsflctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
	u32 flash_linear_addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
	u32 flash_data = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	s32 ret_val = -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	u8 count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	if (size < 1  || size > 2 || offset > ICH_FLASH_LINEAR_ADDR_MASK)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		return -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	flash_linear_addr = (ICH_FLASH_LINEAR_ADDR_MASK & offset) +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
			    hw->nvm.flash_base_addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	do {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		udelay(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		/* Steps */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		ret_val = e1000_flash_cycle_init_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		if (ret_val != 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		hsflctl.regval = er16flash(ICH_FLASH_HSFCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		/* 0b/1b corresponds to 1 or 2 byte size, respectively. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		hsflctl.hsf_ctrl.fldbcount = size - 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_READ;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		ew16flash(ICH_FLASH_HSFCTL, hsflctl.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		ew32flash(ICH_FLASH_FADDR, flash_linear_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		ret_val = e1000_flash_cycle_ich8lan(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
						ICH_FLASH_READ_COMMAND_TIMEOUT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		 * Check if FCERR is set to 1, if set to 1, clear it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		 * and try the whole sequence a few more times, else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		 * read in (shift in) the Flash Data0, the order is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		 * least significant byte first msb to lsb
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		if (ret_val == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
			flash_data = er32flash(ICH_FLASH_FDATA0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
			if (size == 1) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
				*data = (u8)(flash_data & 0x000000FF);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
			} else if (size == 2) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
				*data = (u16)(flash_data & 0x0000FFFF);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
			 * If we've gotten here, then things are probably
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
			 * completely hosed, but if the error condition is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
			 * detected, it won't hurt to give it another try...
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
			 * ICH_FLASH_CYCLE_REPEAT_COUNT times.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
			hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
			if (hsfsts.hsf_status.flcerr == 1) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
				/* Repeat for some time before giving up. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
				continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
			} else if (hsfsts.hsf_status.flcdone == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
				e_dbg("Timeout error - flash cycle "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
					 "did not complete.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
	} while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
 *  e1000_write_nvm_ich8lan - Write word(s) to the NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
 *  @offset: The offset (in bytes) of the word(s) to write.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
 *  @words: Size of data to write in words
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
 *  @data: Pointer to the word(s) to write at offset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
 *  Writes a byte or word to the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
				   u16 *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
	struct e1000_nvm_info *nvm = &hw->nvm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	u16 i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
	if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
	    (words == 0)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		e_dbg("nvm parameter(s) out of bounds\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		return -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	nvm->ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	for (i = 0; i < words; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		dev_spec->shadow_ram[offset+i].modified = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		dev_spec->shadow_ram[offset+i].value = data[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	nvm->ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
 *  e1000_update_nvm_checksum_ich8lan - Update the checksum for NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
 *  The NVM checksum is updated by calling the generic update_nvm_checksum,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
 *  which writes the checksum to the shadow ram.  The changes in the shadow
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
 *  ram are then committed to the EEPROM by processing each bank at a time
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
 *  checking for the modified bit and writing only the pending changes.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
 *  After a successful commit, the shadow ram is cleared and is ready for
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
 *  future writes.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	struct e1000_nvm_info *nvm = &hw->nvm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	u32 i, act_offset, new_bank_offset, old_bank_offset, bank;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	u16 data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
	ret_val = e1000e_update_nvm_checksum_generic(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	if (nvm->type != e1000_nvm_flash_sw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
	nvm->ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
	 * We're writing to the opposite bank so if we're on bank 1,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	 * write to bank 0 etc.  We also need to erase the segment that
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	 * is going to be written
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	ret_val =  e1000_valid_nvm_bank_detect_ich8lan(hw, &bank);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
	if (ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		e_dbg("Could not detect valid bank, assuming bank 0\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		bank = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
	if (bank == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		new_bank_offset = nvm->flash_bank_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		old_bank_offset = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		ret_val = e1000_erase_flash_bank_ich8lan(hw, 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
			goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		old_bank_offset = nvm->flash_bank_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		new_bank_offset = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		ret_val = e1000_erase_flash_bank_ich8lan(hw, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
			goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	for (i = 0; i < E1000_ICH8_SHADOW_RAM_WORDS; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		 * Determine whether to write the value stored
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		 * in the other NVM bank or a modified value stored
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		 * in the shadow RAM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		if (dev_spec->shadow_ram[i].modified) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
			data = dev_spec->shadow_ram[i].value;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
			ret_val = e1000_read_flash_word_ich8lan(hw, i +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
			                                        old_bank_offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
			                                        &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		 * If the word is 0x13, then make sure the signature bits
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		 * (15:14) are 11b until the commit has completed.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		 * This will allow us to write 10b which indicates the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		 * signature is valid.  We want to do this after the write
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		 * has completed so that we don't mark the segment valid
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		 * while the write is still in progress
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		if (i == E1000_ICH_NVM_SIG_WORD)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
			data |= E1000_ICH_NVM_SIG_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		/* Convert offset to bytes. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		act_offset = (i + new_bank_offset) << 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
		udelay(100);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		/* Write the bytes to the new bank. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		ret_val = e1000_retry_write_flash_byte_ich8lan(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
							       act_offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
							       (u8)data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
		udelay(100);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		ret_val = e1000_retry_write_flash_byte_ich8lan(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
							  act_offset + 1,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
							  (u8)(data >> 8));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
	 * Don't bother writing the segment valid bits if sector
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	 * programming failed.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	if (ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		/* Possibly read-only, see e1000e_write_protect_nvm_ich8lan() */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		e_dbg("Flash commit failed.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
		goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	 * Finally validate the new segment by setting bit 15:14
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
	 * to 10b in word 0x13 , this can be done without an
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	 * erase as well since these bits are 11 to start with
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
	 * and we need to change bit 14 to 0b
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
	act_offset = new_bank_offset + E1000_ICH_NVM_SIG_WORD;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	ret_val = e1000_read_flash_word_ich8lan(hw, act_offset, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	data &= 0xBFFF;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	ret_val = e1000_retry_write_flash_byte_ich8lan(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
						       act_offset * 2 + 1,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
						       (u8)(data >> 8));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	 * And invalidate the previously valid segment by setting
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
	 * its signature word (0x13) high_byte to 0b. This can be
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
	 * done without an erase because flash erase sets all bits
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
	 * to 1's. We can write 1's to 0's without an erase
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
	act_offset = (old_bank_offset + E1000_ICH_NVM_SIG_WORD) * 2 + 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
	ret_val = e1000_retry_write_flash_byte_ich8lan(hw, act_offset, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		goto release;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
	/* Great!  Everything worked, we can now clear the cached entries. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
	for (i = 0; i < E1000_ICH8_SHADOW_RAM_WORDS; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		dev_spec->shadow_ram[i].modified = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		dev_spec->shadow_ram[i].value = 0xFFFF;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
release:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	nvm->ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	 * Reload the EEPROM, or else modifications will not appear
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	 * until after the next adapter reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	if (!ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		e1000e_reload_nvm(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		msleep(10);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		e_dbg("NVM update error: %d\n", ret_val);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
 *  e1000_validate_nvm_checksum_ich8lan - Validate EEPROM checksum
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
 *  Check to see if checksum needs to be fixed by reading bit 6 in word 0x19.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
 *  If the bit is 0, that the EEPROM had been modified, but the checksum was not
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
 *  calculated, in which case we need to calculate the checksum and set bit 6.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	u16 data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	 * Read 0x19 and check bit 6.  If this bit is 0, the checksum
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
	 * needs to be fixed.  This bit is an indication that the NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	 * was prepared by OEM software and did not calculate the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
	 * checksum...a likely scenario.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	ret_val = e1000_read_nvm(hw, 0x19, 1, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
	if ((data & 0x40) == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		data |= 0x40;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		ret_val = e1000_write_nvm(hw, 0x19, 1, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		ret_val = e1000e_update_nvm_checksum(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	return e1000e_validate_nvm_checksum_generic(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
 *  e1000e_write_protect_nvm_ich8lan - Make the NVM read-only
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
 *  To prevent malicious write/erase of the NVM, set it to be read-only
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
 *  so that the hardware ignores all write/erase cycles of the NVM via
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
 *  the flash control registers.  The shadow-ram copy of the NVM will
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
 *  still be updated, however any updates to this copy will not stick
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
 *  across driver reloads.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	struct e1000_nvm_info *nvm = &hw->nvm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
	union ich8_flash_protected_range pr0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	union ich8_hws_flash_status hsfsts;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
	u32 gfpreg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	nvm->ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	gfpreg = er32flash(ICH_FLASH_GFPREG);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	/* Write-protect GbE Sector of NVM */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	pr0.regval = er32flash(ICH_FLASH_PR0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	pr0.range.base = gfpreg & FLASH_GFPREG_BASE_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	pr0.range.limit = ((gfpreg >> 16) & FLASH_GFPREG_BASE_MASK);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	pr0.range.wpe = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	ew32flash(ICH_FLASH_PR0, pr0.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
	 * Lock down a subset of GbE Flash Control Registers, e.g.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
	 * PR0 to prevent the write-protection from being lifted.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	 * Once FLOCKDN is set, the registers protected by it cannot
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
	 * be written until FLOCKDN is cleared by a hardware reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	hsfsts.hsf_status.flockdn = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	ew32flash(ICH_FLASH_HSFSTS, hsfsts.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	nvm->ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
 *  e1000_write_flash_data_ich8lan - Writes bytes to the NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
 *  @offset: The offset (in bytes) of the byte/word to read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
 *  @size: Size of data to read, 1=byte 2=word
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
 *  @data: The byte(s) to write to the NVM.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
 *  Writes one/two bytes to the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
					  u8 size, u16 data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	union ich8_hws_flash_status hsfsts;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	union ich8_hws_flash_ctrl hsflctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	u32 flash_linear_addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	u32 flash_data = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	u8 count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	if (size < 1 || size > 2 || data > size * 0xff ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	    offset > ICH_FLASH_LINEAR_ADDR_MASK)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
		return -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	flash_linear_addr = (ICH_FLASH_LINEAR_ADDR_MASK & offset) +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
			    hw->nvm.flash_base_addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	do {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
		udelay(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
		/* Steps */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
		ret_val = e1000_flash_cycle_init_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		hsflctl.regval = er16flash(ICH_FLASH_HSFCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
		/* 0b/1b corresponds to 1 or 2 byte size, respectively. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
		hsflctl.hsf_ctrl.fldbcount = size -1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
		hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_WRITE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		ew16flash(ICH_FLASH_HSFCTL, hsflctl.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		ew32flash(ICH_FLASH_FADDR, flash_linear_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		if (size == 1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
			flash_data = (u32)data & 0x00FF;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
			flash_data = (u32)data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		ew32flash(ICH_FLASH_FDATA0, flash_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		 * check if FCERR is set to 1 , if set to 1, clear it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
		 * and try the whole sequence a few more times else done
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		ret_val = e1000_flash_cycle_ich8lan(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
					       ICH_FLASH_WRITE_COMMAND_TIMEOUT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
		if (!ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		 * If we're here, then things are most likely
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		 * completely hosed, but if the error condition
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		 * is detected, it won't hurt to give it another
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		 * try...ICH_FLASH_CYCLE_REPEAT_COUNT times.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		if (hsfsts.hsf_status.flcerr == 1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
			/* Repeat for some time before giving up. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
			continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
		if (hsfsts.hsf_status.flcdone == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
			e_dbg("Timeout error - flash cycle "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
				 "did not complete.");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	} while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
 *  e1000_write_flash_byte_ich8lan - Write a single byte to NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
 *  @offset: The index of the byte to read.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
 *  @data: The byte to write to the NVM.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
 *  Writes a single byte to the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
static s32 e1000_write_flash_byte_ich8lan(struct e1000_hw *hw, u32 offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
					  u8 data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	u16 word = (u16)data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
	return e1000_write_flash_data_ich8lan(hw, offset, 1, word);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
 *  e1000_retry_write_flash_byte_ich8lan - Writes a single byte to NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
 *  @offset: The offset of the byte to write.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
 *  @byte: The byte to write to the NVM.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
 *  Writes a single byte to the NVM using the flash access registers.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
 *  Goes through a retry algorithm before giving up.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
static s32 e1000_retry_write_flash_byte_ich8lan(struct e1000_hw *hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
						u32 offset, u8 byte)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	u16 program_retries;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	ret_val = e1000_write_flash_byte_ich8lan(hw, offset, byte);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	if (!ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	for (program_retries = 0; program_retries < 100; program_retries++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		e_dbg("Retrying Byte %2.2X at offset %u\n", byte, offset);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		udelay(100);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		ret_val = e1000_write_flash_byte_ich8lan(hw, offset, byte);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		if (!ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
	if (program_retries == 100)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		return -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
 *  e1000_erase_flash_bank_ich8lan - Erase a bank (4k) from NVM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
 *  @bank: 0 for first bank, 1 for second bank, etc.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
 *  Erases the bank specified. Each bank is a 4k block. Banks are 0 based.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
 *  bank N is 4096 * N + flash_reg_addr.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
	struct e1000_nvm_info *nvm = &hw->nvm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	union ich8_hws_flash_status hsfsts;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	union ich8_hws_flash_ctrl hsflctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	u32 flash_linear_addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	/* bank size is in 16bit words - adjust to bytes */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
	u32 flash_bank_size = nvm->flash_bank_size * 2;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
	s32 count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	s32 j, iteration, sector_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	 * Determine HW Sector size: Read BERASE bits of hw flash status
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	 * register
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	 * 00: The Hw sector is 256 bytes, hence we need to erase 16
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
	 *     consecutive sectors.  The start index for the nth Hw sector
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	 *     can be calculated as = bank * 4096 + n * 256
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
	 * 01: The Hw sector is 4K bytes, hence we need to erase 1 sector.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	 *     The start index for the nth Hw sector can be calculated
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	 *     as = bank * 4096
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
	 * 10: The Hw sector is 8K bytes, nth sector = bank * 8192
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	 *     (ich9 only, otherwise error condition)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	 * 11: The Hw sector is 64K bytes, nth sector = bank * 65536
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	switch (hsfsts.hsf_status.berasesz) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
	case 0:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		/* Hw sector size 256 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		sector_size = ICH_FLASH_SEG_SIZE_256;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_256;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
	case 1:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		sector_size = ICH_FLASH_SEG_SIZE_4K;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		iteration = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	case 2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		sector_size = ICH_FLASH_SEG_SIZE_8K;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		iteration = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	case 3:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		sector_size = ICH_FLASH_SEG_SIZE_64K;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
		iteration = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		return -E1000_ERR_NVM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	/* Start with the base address, then add the sector offset. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	flash_linear_addr = hw->nvm.flash_base_addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	flash_linear_addr += (bank) ? flash_bank_size : 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
	for (j = 0; j < iteration ; j++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		do {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
			/* Steps */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
			ret_val = e1000_flash_cycle_init_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
			if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
			 * Write a value 11 (block Erase) in Flash
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
			 * Cycle field in hw flash control
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
			hsflctl.regval = er16flash(ICH_FLASH_HSFCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
			hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_ERASE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
			ew16flash(ICH_FLASH_HSFCTL, hsflctl.regval);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
			 * Write the last 24 bits of an index within the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
			 * block into Flash Linear address field in Flash
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
			 * Address.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
			flash_linear_addr += (j * sector_size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
			ew32flash(ICH_FLASH_FADDR, flash_linear_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
			ret_val = e1000_flash_cycle_ich8lan(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
					       ICH_FLASH_ERASE_COMMAND_TIMEOUT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
			if (ret_val == 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
			 * Check if FCERR is set to 1.  If 1,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
			 * clear it and try the whole sequence
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
			 * a few more times else Done
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
			hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
			if (hsfsts.hsf_status.flcerr == 1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
				/* repeat for some time before giving up */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
				continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
			else if (hsfsts.hsf_status.flcdone == 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
				return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		} while (++count < ICH_FLASH_CYCLE_REPEAT_COUNT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
 *  e1000_valid_led_default_ich8lan - Set the default LED settings
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
 *  @data: Pointer to the LED settings
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
 *  Reads the LED default settings from the NVM to data.  If the NVM LED
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
 *  settings is all 0's or F's, set the LED default to a valid LED default
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
 *  setting.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
static s32 e1000_valid_led_default_ich8lan(struct e1000_hw *hw, u16 *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	ret_val = e1000_read_nvm(hw, NVM_ID_LED_SETTINGS, 1, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	if (ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		e_dbg("NVM Read Error\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	if (*data == ID_LED_RESERVED_0000 ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	    *data == ID_LED_RESERVED_FFFF)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		*data = ID_LED_DEFAULT_ICH8LAN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
 *  e1000_id_led_init_pchlan - store LED configurations
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
 *  PCH does not control LEDs via the LEDCTL register, rather it uses
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
 *  the PHY LED configuration register.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
 *  PCH also does not have an "always on" or "always off" mode which
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
 *  complicates the ID feature.  Instead of using the "on" mode to indicate
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
 *  in ledctl_mode2 the LEDs to use for ID (see e1000e_id_led_init()),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
 *  use "link_up" mode.  The LEDs will still ID on request if there is no
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
 *  link based on logic in e1000_led_[on|off]_pchlan().
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	struct e1000_mac_info *mac = &hw->mac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	const u32 ledctl_on = E1000_LEDCTL_MODE_LINK_UP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
	const u32 ledctl_off = E1000_LEDCTL_MODE_LINK_UP | E1000_PHY_LED0_IVRT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	u16 data, i, temp, shift;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	/* Get default ID LED modes */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	ret_val = hw->nvm.ops.valid_led_default(hw, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
	mac->ledctl_default = er32(LEDCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	mac->ledctl_mode1 = mac->ledctl_default;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	mac->ledctl_mode2 = mac->ledctl_default;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	for (i = 0; i < 4; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		temp = (data >> (i << 2)) & E1000_LEDCTL_LED0_MODE_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		shift = (i * 5);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
		switch (temp) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		case ID_LED_ON1_DEF2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		case ID_LED_ON1_ON2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		case ID_LED_ON1_OFF2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
			mac->ledctl_mode1 &= ~(E1000_PHY_LED0_MASK << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
			mac->ledctl_mode1 |= (ledctl_on << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		case ID_LED_OFF1_DEF2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		case ID_LED_OFF1_ON2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		case ID_LED_OFF1_OFF2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
			mac->ledctl_mode1 &= ~(E1000_PHY_LED0_MASK << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
			mac->ledctl_mode1 |= (ledctl_off << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
			/* Do nothing */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		switch (temp) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		case ID_LED_DEF1_ON2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		case ID_LED_ON1_ON2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		case ID_LED_OFF1_ON2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
			mac->ledctl_mode2 &= ~(E1000_PHY_LED0_MASK << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
			mac->ledctl_mode2 |= (ledctl_on << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		case ID_LED_DEF1_OFF2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		case ID_LED_ON1_OFF2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		case ID_LED_OFF1_OFF2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
			mac->ledctl_mode2 &= ~(E1000_PHY_LED0_MASK << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
			mac->ledctl_mode2 |= (ledctl_off << shift);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
			/* Do nothing */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
 *  e1000_get_bus_info_ich8lan - Get/Set the bus type and width
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
 *  ICH8 use the PCI Express bus, but does not contain a PCI Express Capability
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
 *  register, so the the bus width is hard coded.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
static s32 e1000_get_bus_info_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	struct e1000_bus_info *bus = &hw->bus;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	ret_val = e1000e_get_bus_info_pcie(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	 * ICH devices are "PCI Express"-ish.  They have
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	 * a configuration space, but do not contain
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
	 * PCI Express Capability registers, so bus width
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	 * must be hardcoded.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
	if (bus->width == e1000_bus_width_unknown)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		bus->width = e1000_bus_width_pcie_x1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
 *  e1000_reset_hw_ich8lan - Reset the hardware
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
 *  Does a full reset of the hardware which includes a reset of the PHY and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
 *  MAC.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	u16 reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	u32 ctrl, icr, kab;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
	 * Prevent the PCI-E bus from sticking if there is no TLP connection
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	 * on the last TLP read/write transaction when MAC is reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	ret_val = e1000e_disable_pcie_master(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
		e_dbg("PCI-E Master disable polling has failed.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	e_dbg("Masking off all interrupts\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	ew32(IMC, 0xffffffff);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
	 * Disable the Transmit and Receive units.  Then delay to allow
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	 * any pending transactions to complete before we hit the MAC
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	 * with the global reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
	ew32(RCTL, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
	ew32(TCTL, E1000_TCTL_PSP);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	msleep(10);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
	/* Workaround for ICH8 bit corruption issue in FIFO memory */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
	if (hw->mac.type == e1000_ich8lan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
		/* Set Tx and Rx buffer allocation to 8k apiece. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
		ew32(PBA, E1000_PBA_8K);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
		/* Set Packet Buffer Size to 16k. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
		ew32(PBS, E1000_PBS_16K);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
	if (hw->mac.type == e1000_pchlan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		/* Save the NVM K1 bit setting*/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
		ret_val = e1000_read_nvm(hw, E1000_NVM_K1_CONFIG, 1, &reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
		if (reg & E1000_NVM_K1_ENABLE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
			dev_spec->nvm_k1_enabled = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
			dev_spec->nvm_k1_enabled = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	ctrl = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	if (!e1000_check_reset_block(hw)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
		 * Full-chip reset requires MAC and PHY reset at the same
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
		 * time to make sure the interface between MAC and the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
		 * external PHY is reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
		ctrl |= E1000_CTRL_PHY_RST;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	ret_val = e1000_acquire_swflag_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	e_dbg("Issuing a global reset to ich8lan\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	ew32(CTRL, (ctrl | E1000_CTRL_RST));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	msleep(20);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	if (!ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
		e1000_release_swflag_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	if (ctrl & E1000_CTRL_PHY_RST) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
		ret_val = hw->phy.ops.get_cfg_done(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		ret_val = e1000_post_phy_reset_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
			goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	 * For PCH, this write will make sure that any noise
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
	 * will be detected as a CRC error and be dropped rather than show up
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
	 * as a bad packet to the DMA engine.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	if (hw->mac.type == e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
		ew32(CRC_OFFSET, 0x65656565);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
	ew32(IMC, 0xffffffff);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	icr = er32(ICR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	kab = er32(KABGTXD);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	kab |= E1000_KABGTXD_BGSQLBIAS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	ew32(KABGTXD, kab);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
 *  e1000_init_hw_ich8lan - Initialize the hardware
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
 *  Prepares the hardware for transmit and receive by doing the following:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
 *   - initialize hardware bits
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
 *   - initialize LED identification
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
 *   - setup receive address registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
 *   - setup flow control
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
 *   - setup transmit descriptors
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
 *   - clear statistics
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	struct e1000_mac_info *mac = &hw->mac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	u32 ctrl_ext, txdctl, snoop;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	u16 i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	e1000_initialize_hw_bits_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	/* Initialize identification LED */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	ret_val = mac->ops.id_led_init(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		e_dbg("Error initializing identification LED\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		/* This is not fatal and we should not stop init due to this */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	/* Setup the receive address. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	e1000e_init_rx_addrs(hw, mac->rar_entry_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	/* Zero out the Multicast HASH table */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	e_dbg("Zeroing the MTA\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
	for (i = 0; i < mac->mta_reg_count; i++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
		E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
	 * The 82578 Rx buffer will stall if wakeup is enabled in host and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
	 * the ME.  Reading the BM_WUC register will clear the host wakeup bit.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	 * Reset the phy after disabling host wakeup to reset the Rx buffer.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	if (hw->phy.type == e1000_phy_82578) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
		hw->phy.ops.read_reg(hw, BM_WUC, &i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
		ret_val = e1000_phy_hw_reset_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	/* Setup link and flow control */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	ret_val = e1000_setup_link_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
	/* Set the transmit descriptor write-back policy for both queues */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	txdctl = er32(TXDCTL(0));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		 E1000_TXDCTL_FULL_TX_DESC_WB;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
	txdctl = (txdctl & ~E1000_TXDCTL_PTHRESH) |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
		 E1000_TXDCTL_MAX_TX_DESC_PREFETCH;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
	ew32(TXDCTL(0), txdctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	txdctl = er32(TXDCTL(1));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		 E1000_TXDCTL_FULL_TX_DESC_WB;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	txdctl = (txdctl & ~E1000_TXDCTL_PTHRESH) |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
		 E1000_TXDCTL_MAX_TX_DESC_PREFETCH;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	ew32(TXDCTL(1), txdctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	 * ICH8 has opposite polarity of no_snoop bits.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	 * By default, we should use snoop behavior.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	if (mac->type == e1000_ich8lan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
		snoop = PCIE_ICH8_SNOOP_ALL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		snoop = (u32) ~(PCIE_NO_SNOOP_ALL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	e1000e_set_pcie_no_snoop(hw, snoop);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	ctrl_ext = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	ew32(CTRL_EXT, ctrl_ext);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	 * Clear all of the statistics registers (clear on read).  It is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	 * important that we do this after we have tried to establish link
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	 * because the symbol error count will increment wildly if there
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
	 * is no link.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	e1000_clear_hw_cntrs_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
 *  e1000_initialize_hw_bits_ich8lan - Initialize required hardware bits
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
 *  Sets/Clears required hardware bits necessary for correctly setting up the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
 *  hardware for transmit and receive.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	u32 reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	/* Extended Device Control */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	reg = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	reg |= (1 << 22);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	/* Enable PHY low-power state when MAC is at D3 w/o WoL */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	if (hw->mac.type >= e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		reg |= E1000_CTRL_EXT_PHYPDEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	ew32(CTRL_EXT, reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	/* Transmit Descriptor Control 0 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	reg = er32(TXDCTL(0));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	reg |= (1 << 22);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	ew32(TXDCTL(0), reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	/* Transmit Descriptor Control 1 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	reg = er32(TXDCTL(1));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	reg |= (1 << 22);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	ew32(TXDCTL(1), reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	/* Transmit Arbitration Control 0 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	reg = er32(TARC(0));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	if (hw->mac.type == e1000_ich8lan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		reg |= (1 << 28) | (1 << 29);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
	reg |= (1 << 23) | (1 << 24) | (1 << 26) | (1 << 27);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	ew32(TARC(0), reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	/* Transmit Arbitration Control 1 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	reg = er32(TARC(1));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
	if (er32(TCTL) & E1000_TCTL_MULR)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		reg &= ~(1 << 28);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		reg |= (1 << 28);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	reg |= (1 << 24) | (1 << 26) | (1 << 30);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	ew32(TARC(1), reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	/* Device Status */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	if (hw->mac.type == e1000_ich8lan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
		reg = er32(STATUS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
		reg &= ~(1 << 31);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
		ew32(STATUS, reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	 * work-around descriptor data corruption issue during nfs v2 udp
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
	 * traffic, just disable the nfs filtering capability
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	reg = er32(RFCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
	reg |= (E1000_RFCTL_NFSW_DIS | E1000_RFCTL_NFSR_DIS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	ew32(RFCTL, reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
 *  e1000_setup_link_ich8lan - Setup flow control and link settings
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
 *  Determines which flow control settings to use, then configures flow
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
 *  control.  Calls the appropriate media-specific link configuration
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
 *  function.  Assuming the adapter has a valid link partner, a valid link
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
 *  should be established.  Assumes the hardware has previously been reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
 *  and the transmitter and receiver are not enabled.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	if (e1000_check_reset_block(hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	 * ICH parts do not have a word in the NVM to determine
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	 * the default flow control setting, so we explicitly
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	 * set it to full.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	if (hw->fc.requested_mode == e1000_fc_default) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
		/* Workaround h/w hang when Tx flow control enabled */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
		if (hw->mac.type == e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
			hw->fc.requested_mode = e1000_fc_rx_pause;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
			hw->fc.requested_mode = e1000_fc_full;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	 * Save off the requested flow control mode for use later.  Depending
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	 * on the link partner's capabilities, we may or may not use this mode.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	hw->fc.current_mode = hw->fc.requested_mode;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	e_dbg("After fix-ups FlowControl is now = %x\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
		hw->fc.current_mode);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	/* Continue to configure the copper link. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	ret_val = e1000_setup_copper_link_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	ew32(FCTTV, hw->fc.pause_time);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	if ((hw->phy.type == e1000_phy_82578) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	    (hw->phy.type == e1000_phy_82577)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
		ew32(FCRTV_PCH, hw->fc.refresh_time);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
		ret_val = hw->phy.ops.write_reg(hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		                             PHY_REG(BM_PORT_CTRL_PAGE, 27),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
		                             hw->fc.pause_time);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	return e1000e_set_fc_watermarks(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
 *  e1000_setup_copper_link_ich8lan - Configure MAC/PHY interface
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
 *  Configures the kumeran interface to the PHY to wait the appropriate time
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
 *  when polling the PHY, then call the generic setup_copper_link to finish
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
 *  configuring the copper link.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	u32 ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	u16 reg_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
	ctrl = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	ctrl |= E1000_CTRL_SLU;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
	ew32(CTRL, ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	 * Set the mac to wait the maximum time between each iteration
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	 * and increase the max iterations when polling the phy;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	 * this fixes erroneous timeouts at 10Mbps.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_TIMEOUTS, 0xFFFF);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	ret_val = e1000e_read_kmrn_reg(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	                               &reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	reg_data |= 0x3F;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	                                reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	switch (hw->phy.type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	case e1000_phy_igp_3:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
		ret_val = e1000e_copper_link_setup_igp(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	case e1000_phy_bm:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	case e1000_phy_82578:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
		ret_val = e1000e_copper_link_setup_m88(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	case e1000_phy_82577:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
		ret_val = e1000_copper_link_setup_82577(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	case e1000_phy_ife:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
		ret_val = hw->phy.ops.read_reg(hw, IFE_PHY_MDIX_CONTROL,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
		                               &reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
		reg_data &= ~IFE_PMC_AUTO_MDIX;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
		switch (hw->phy.mdix) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
		case 1:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
			reg_data &= ~IFE_PMC_FORCE_MDIX;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
		case 2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
			reg_data |= IFE_PMC_FORCE_MDIX;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
		case 0:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
		default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
			reg_data |= IFE_PMC_AUTO_MDIX;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
		ret_val = hw->phy.ops.write_reg(hw, IFE_PHY_MDIX_CONTROL,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
		                                reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	return e1000e_setup_copper_link(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
 *  e1000_get_link_up_info_ich8lan - Get current link speed and duplex
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
 *  @speed: pointer to store current link speed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
 *  @duplex: pointer to store the current link duplex
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
 *  Calls the generic get_speed_and_duplex to retrieve the current link
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
 *  information and then calls the Kumeran lock loss workaround for links at
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
 *  gigabit speeds.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
static s32 e1000_get_link_up_info_ich8lan(struct e1000_hw *hw, u16 *speed,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
					  u16 *duplex)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
	ret_val = e1000e_get_speed_and_duplex_copper(hw, speed, duplex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
		return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	if ((hw->mac.type == e1000_ich8lan) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	    (hw->phy.type == e1000_phy_igp_3) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	    (*speed == SPEED_1000)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
		ret_val = e1000_kmrn_lock_loss_workaround_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
 *  e1000_kmrn_lock_loss_workaround_ich8lan - Kumeran workaround
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
 *  Work-around for 82566 Kumeran PCS lock loss:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
 *  On link status change (i.e. PCI reset, speed change) and link is up and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
 *  speed is gigabit-
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
 *    0) if workaround is optionally disabled do nothing
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
 *    1) wait 1ms for Kumeran link to come up
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
 *    2) check Kumeran Diagnostic register PCS lock loss bit
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
 *    3) if not set the link is locked (all is good), otherwise...
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
 *    4) reset the PHY
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
 *    5) repeat up to 10 times
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
 *  Note: this is only called for IGP3 copper when speed is 1gb.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
static s32 e1000_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	u32 phy_ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	u16 i, data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	bool link;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	if (!dev_spec->kmrn_lock_loss_workaround_enabled)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	 * Make sure link is up before proceeding.  If not just return.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	 * Attempting this while link is negotiating fouled up link
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	 * stability
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
	ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	if (!link)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	for (i = 0; i < 10; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
		/* read once to clear */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
		ret_val = e1e_rphy(hw, IGP3_KMRN_DIAG, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
		/* and again to get new status */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
		ret_val = e1e_rphy(hw, IGP3_KMRN_DIAG, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
			return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		/* check for PCS lock */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		if (!(data & IGP3_KMRN_DIAG_PCS_LOCK_LOSS))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		/* Issue PHY reset */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		e1000_phy_hw_reset(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
		mdelay(5);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	/* Disable GigE link negotiation */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
	phy_ctrl = er32(PHY_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	phy_ctrl |= (E1000_PHY_CTRL_GBE_DISABLE |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
		     E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	ew32(PHY_CTRL, phy_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
	 * Call gig speed drop workaround on Gig disable before accessing
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
	 * any PHY registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
	e1000e_gig_downshift_workaround_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	/* unable to acquire PCS lock */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	return -E1000_ERR_PHY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
 *  e1000_set_kmrn_lock_loss_workaround_ich8lan - Set Kumeran workaround state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
 *  @state: boolean value used to set the current Kumeran workaround state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
 *  If ICH8, set the current Kumeran workaround state (enabled - true
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
 *  /disabled - false).
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
						 bool state)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	if (hw->mac.type != e1000_ich8lan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
		e_dbg("Workaround applies to ICH8 only.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	dev_spec->kmrn_lock_loss_workaround_enabled = state;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
 *  e1000_ipg3_phy_powerdown_workaround_ich8lan - Power down workaround on D3
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
 *  Workaround for 82566 power-down on D3 entry:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
 *    1) disable gigabit link
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
 *    2) write VR power-down enable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
 *    3) read it back
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
 *  Continue if successful, else issue LCD reset and repeat
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	u32 reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	u16 data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	u8  retry = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	if (hw->phy.type != e1000_phy_igp_3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
	/* Try the workaround twice (if needed) */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	do {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		/* Disable link */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
		reg = er32(PHY_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
		reg |= (E1000_PHY_CTRL_GBE_DISABLE |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
			E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
		ew32(PHY_CTRL, reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
		 * Call gig speed drop workaround on Gig disable before
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
		 * accessing any PHY registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
		if (hw->mac.type == e1000_ich8lan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
			e1000e_gig_downshift_workaround_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
		/* Write VR power-down enable */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
		e1e_rphy(hw, IGP3_VR_CTRL, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
		data &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
		e1e_wphy(hw, IGP3_VR_CTRL, data | IGP3_VR_CTRL_MODE_SHUTDOWN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
		/* Read it back and test */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
		e1e_rphy(hw, IGP3_VR_CTRL, &data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
		data &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
		if ((data == IGP3_VR_CTRL_MODE_SHUTDOWN) || retry)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
		/* Issue PHY reset and repeat at most one more time */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
		reg = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
		ew32(CTRL, reg | E1000_CTRL_PHY_RST);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
		retry++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	} while (retry);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
 *  e1000e_gig_downshift_workaround_ich8lan - WoL from S5 stops working
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
 *  Steps to take when dropping from 1Gb/s (eg. link cable removal (LSC),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
 *  LPLU, Gig disable, MDIC PHY reset):
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
 *    1) Set Kumeran Near-end loopback
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
 *    2) Clear Kumeran Near-end loopback
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
 *  Should only be called for ICH8[m] devices with IGP_3 Phy.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	s32 ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	u16 reg_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	if ((hw->mac.type != e1000_ich8lan) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
	    (hw->phy.type != e1000_phy_igp_3))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	ret_val = e1000e_read_kmrn_reg(hw, E1000_KMRNCTRLSTA_DIAG_OFFSET,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
				      &reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	reg_data |= E1000_KMRNCTRLSTA_DIAG_NELPBK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_DIAG_OFFSET,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
				       reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
	reg_data &= ~E1000_KMRNCTRLSTA_DIAG_NELPBK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
	ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_DIAG_OFFSET,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
				       reg_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
 *  e1000e_disable_gig_wol_ich8lan - disable gig during WoL
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
 *  During S0 to Sx transition, it is possible the link remains at gig
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
 *  instead of negotiating to a lower speed.  Before going to Sx, set
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
 *  'LPLU Enabled' and 'Gig Disable' to force link speed negotiation
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
 *  to a lower speed.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
 *  Should only be called for applicable parts.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
	u32 phy_ctrl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	switch (hw->mac.type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	case e1000_ich8lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	case e1000_ich9lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	case e1000_ich10lan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	case e1000_pchlan:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
		phy_ctrl = er32(PHY_CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
		phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
		            E1000_PHY_CTRL_GBE_DISABLE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
		ew32(PHY_CTRL, phy_ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
		if (hw->mac.type == e1000_pchlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
			e1000_phy_hw_reset_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
 *  e1000_cleanup_led_ich8lan - Restore the default LED operation
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
 *  Return the LED back to the default configuration.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
static s32 e1000_cleanup_led_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	if (hw->phy.type == e1000_phy_ife)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
		return e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	ew32(LEDCTL, hw->mac.ledctl_default);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
 *  e1000_led_on_ich8lan - Turn LEDs on
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
 *  Turn on the LEDs.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
static s32 e1000_led_on_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
	if (hw->phy.type == e1000_phy_ife)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
		return e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
				(IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	ew32(LEDCTL, hw->mac.ledctl_mode2);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
 *  e1000_led_off_ich8lan - Turn LEDs off
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
 *  Turn off the LEDs.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
static s32 e1000_led_off_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	if (hw->phy.type == e1000_phy_ife)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		return e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
			       (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
	ew32(LEDCTL, hw->mac.ledctl_mode1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
 *  e1000_setup_led_pchlan - Configures SW controllable LED
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
 *  This prepares the SW controllable LED for use.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
static s32 e1000_setup_led_pchlan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
	return hw->phy.ops.write_reg(hw, HV_LED_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
					(u16)hw->mac.ledctl_mode1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
 *  e1000_cleanup_led_pchlan - Restore the default LED operation
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
 *  Return the LED back to the default configuration.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	return hw->phy.ops.write_reg(hw, HV_LED_CONFIG,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
					(u16)hw->mac.ledctl_default);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
 *  e1000_led_on_pchlan - Turn LEDs on
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
 *  Turn on the LEDs.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
static s32 e1000_led_on_pchlan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	u16 data = (u16)hw->mac.ledctl_mode2;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
	u32 i, led;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
	 * If no link, then turn LED on by setting the invert bit
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	 * for each LED that's mode is "link_up" in ledctl_mode2.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	if (!(er32(STATUS) & E1000_STATUS_LU)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
		for (i = 0; i < 3; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
			led = (data >> (i * 5)) & E1000_PHY_LED0_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
			if ((led & E1000_PHY_LED0_MODE_MASK) !=
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
			    E1000_LEDCTL_MODE_LINK_UP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
				continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
			if (led & E1000_PHY_LED0_IVRT)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
				data &= ~(E1000_PHY_LED0_IVRT << (i * 5));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
			else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
				data |= (E1000_PHY_LED0_IVRT << (i * 5));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
	return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
 *  e1000_led_off_pchlan - Turn LEDs off
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
 *  Turn off the LEDs.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
static s32 e1000_led_off_pchlan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	u16 data = (u16)hw->mac.ledctl_mode1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	u32 i, led;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	 * If no link, then turn LED off by clearing the invert bit
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	 * for each LED that's mode is "link_up" in ledctl_mode1.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	if (!(er32(STATUS) & E1000_STATUS_LU)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
		for (i = 0; i < 3; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
			led = (data >> (i * 5)) & E1000_PHY_LED0_MASK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
			if ((led & E1000_PHY_LED0_MODE_MASK) !=
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
			    E1000_LEDCTL_MODE_LINK_UP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
				continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
			if (led & E1000_PHY_LED0_IVRT)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
				data &= ~(E1000_PHY_LED0_IVRT << (i * 5));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
			else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
				data |= (E1000_PHY_LED0_IVRT << (i * 5));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
 *  e1000_get_cfg_done_ich8lan - Read config done bit after Full or PHY reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
 *  Read appropriate register for the config done bit for completion status
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
 *  and configure the PHY through s/w for EEPROM-less parts.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
 *  NOTE: some silicon which is EEPROM-less will fail trying to read the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
 *  config done bit, so only an error is logged and continues.  If we were
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
 *  to return with error, EEPROM-less silicon would not be able to be reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
 *  or change link.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
	u32 bank = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	u32 status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	e1000e_get_cfg_done(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	/* Wait for indication from h/w that it has completed basic config */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
	if (hw->mac.type >= e1000_ich10lan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
		e1000_lan_init_done_ich8lan(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
		ret_val = e1000e_get_auto_rd_done(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
		if (ret_val) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
			 * When auto config read does not complete, do not
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
			 * return with an error. This can happen in situations
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
			 * where there is no eeprom and prevents getting link.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
			e_dbg("Auto Read Done did not complete\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
			ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	/* Clear PHY Reset Asserted bit */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	status = er32(STATUS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
	if (status & E1000_STATUS_PHYRA)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
		ew32(STATUS, status & ~E1000_STATUS_PHYRA);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
		e_dbg("PHY Reset Asserted not set - needs delay\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	/* If EEPROM is not marked present, init the IGP 3 PHY manually */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	if (hw->mac.type <= e1000_ich9lan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
		if (((er32(EECD) & E1000_EECD_PRES) == 0) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
		    (hw->phy.type == e1000_phy_igp_3)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
			e1000e_phy_init_script_igp3(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
		if (e1000_valid_nvm_bank_detect_ich8lan(hw, &bank)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
			/* Maybe we should do a basic PHY config */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
			e_dbg("EEPROM not present\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
			ret_val = -E1000_ERR_CONFIG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	return ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
 * e1000_power_down_phy_copper_ich8lan - Remove link during PHY power down
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
 * @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
 * In the case of a PHY power down to save power, or to turn off link during a
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
 * driver unload, or wake on lan is not enabled, remove the link.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
static void e1000_power_down_phy_copper_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	/* If the management interface is not enabled, then power down */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	if (!(hw->mac.ops.check_mng_mode(hw) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
	      hw->phy.ops.check_reset_block(hw)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
		e1000_power_down_phy_copper(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
 *  e1000_clear_hw_cntrs_ich8lan - Clear statistical counters
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
 *  Clears hardware counters specific to the silicon family and calls
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
 *  clear_hw_cntrs_generic to clear all general purpose counters.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	u16 phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	e1000e_clear_hw_cntrs_base(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
	er32(ALGNERRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	er32(RXERRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	er32(TNCRS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	er32(CEXTERR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	er32(TSCTC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	er32(TSCTFC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
	er32(MGTPRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	er32(MGTPDC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
	er32(MGTPTC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	er32(IAC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	er32(ICRXOC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	/* Clear PHY statistics registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	if ((hw->phy.type == e1000_phy_82578) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	    (hw->phy.type == e1000_phy_82577)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
		hw->phy.ops.read_reg(hw, HV_SCC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
		hw->phy.ops.read_reg(hw, HV_SCC_LOWER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
		hw->phy.ops.read_reg(hw, HV_ECOL_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
		hw->phy.ops.read_reg(hw, HV_ECOL_LOWER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
		hw->phy.ops.read_reg(hw, HV_MCC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
		hw->phy.ops.read_reg(hw, HV_MCC_LOWER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
		hw->phy.ops.read_reg(hw, HV_LATECOL_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
		hw->phy.ops.read_reg(hw, HV_LATECOL_LOWER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
		hw->phy.ops.read_reg(hw, HV_COLC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		hw->phy.ops.read_reg(hw, HV_COLC_LOWER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
		hw->phy.ops.read_reg(hw, HV_DC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
		hw->phy.ops.read_reg(hw, HV_DC_LOWER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
		hw->phy.ops.read_reg(hw, HV_TNCRS_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
		hw->phy.ops.read_reg(hw, HV_TNCRS_LOWER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
static struct e1000_mac_operations ich8_mac_ops = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	.id_led_init		= e1000e_id_led_init,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
	.check_mng_mode		= e1000_check_mng_mode_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	.check_for_link		= e1000_check_for_copper_link_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	/* cleanup_led dependent on mac type */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	.clear_hw_cntrs		= e1000_clear_hw_cntrs_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
	.get_bus_info		= e1000_get_bus_info_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	.set_lan_id		= e1000_set_lan_id_single_port,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	.get_link_up_info	= e1000_get_link_up_info_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
	/* led_on dependent on mac type */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	/* led_off dependent on mac type */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	.update_mc_addr_list	= e1000e_update_mc_addr_list_generic,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	.reset_hw		= e1000_reset_hw_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	.init_hw		= e1000_init_hw_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	.setup_link		= e1000_setup_link_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	.setup_physical_interface= e1000_setup_copper_link_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	/* id_led_init dependent on mac type */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
static struct e1000_phy_operations ich8_phy_ops = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	.acquire		= e1000_acquire_swflag_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
	.check_reset_block	= e1000_check_reset_block_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	.commit			= NULL,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	.get_cfg_done		= e1000_get_cfg_done_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
	.get_cable_length	= e1000e_get_cable_length_igp_2,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
	.read_reg		= e1000e_read_phy_reg_igp,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
	.release		= e1000_release_swflag_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	.reset			= e1000_phy_hw_reset_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	.set_d0_lplu_state	= e1000_set_d0_lplu_state_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
	.set_d3_lplu_state	= e1000_set_d3_lplu_state_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	.write_reg		= e1000e_write_phy_reg_igp,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
static struct e1000_nvm_operations ich8_nvm_ops = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	.acquire		= e1000_acquire_nvm_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	.read		 	= e1000_read_nvm_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
	.release		= e1000_release_nvm_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	.update			= e1000_update_nvm_checksum_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	.valid_led_default	= e1000_valid_led_default_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	.validate		= e1000_validate_nvm_checksum_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
	.write			= e1000_write_nvm_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
struct e1000_info e1000_ich8_info = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	.mac			= e1000_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	.flags			= FLAG_HAS_WOL
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
				  | FLAG_IS_ICH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
				  | FLAG_RX_CSUM_ENABLED
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
				  | FLAG_HAS_CTRLEXT_ON_LOAD
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
				  | FLAG_HAS_AMT
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
				  | FLAG_HAS_FLASH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
				  | FLAG_APME_IN_WUC,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	.pba			= 8,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	.max_hw_frame_size	= ETH_FRAME_LEN + ETH_FCS_LEN,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	.get_variants		= e1000_get_variants_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
	.mac_ops		= &ich8_mac_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	.phy_ops		= &ich8_phy_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	.nvm_ops		= &ich8_nvm_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
struct e1000_info e1000_ich9_info = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	.mac			= e1000_ich9lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
	.flags			= FLAG_HAS_JUMBO_FRAMES
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
				  | FLAG_IS_ICH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
				  | FLAG_HAS_WOL
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
				  | FLAG_RX_CSUM_ENABLED
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
				  | FLAG_HAS_CTRLEXT_ON_LOAD
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
				  | FLAG_HAS_AMT
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
				  | FLAG_HAS_ERT
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
				  | FLAG_HAS_FLASH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
				  | FLAG_APME_IN_WUC,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	.pba			= 10,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
	.max_hw_frame_size	= DEFAULT_JUMBO,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
	.get_variants		= e1000_get_variants_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	.mac_ops		= &ich8_mac_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	.phy_ops		= &ich8_phy_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	.nvm_ops		= &ich8_nvm_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
struct e1000_info e1000_ich10_info = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
	.mac			= e1000_ich10lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	.flags			= FLAG_HAS_JUMBO_FRAMES
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
				  | FLAG_IS_ICH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
				  | FLAG_HAS_WOL
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
				  | FLAG_RX_CSUM_ENABLED
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
				  | FLAG_HAS_CTRLEXT_ON_LOAD
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
				  | FLAG_HAS_AMT
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
				  | FLAG_HAS_ERT
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
				  | FLAG_HAS_FLASH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
				  | FLAG_APME_IN_WUC,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	.pba			= 10,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	.max_hw_frame_size	= DEFAULT_JUMBO,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	.get_variants		= e1000_get_variants_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	.mac_ops		= &ich8_mac_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	.phy_ops		= &ich8_phy_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	.nvm_ops		= &ich8_nvm_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
struct e1000_info e1000_pch_info = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	.mac			= e1000_pchlan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	.flags			= FLAG_IS_ICH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
				  | FLAG_HAS_WOL
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
				  | FLAG_RX_CSUM_ENABLED
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
				  | FLAG_HAS_CTRLEXT_ON_LOAD
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
				  | FLAG_HAS_AMT
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
				  | FLAG_HAS_FLASH
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
				  | FLAG_HAS_JUMBO_FRAMES
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
				  | FLAG_DISABLE_FC_PAUSE_TIME /* errata */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
				  | FLAG_APME_IN_WUC,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	.pba			= 26,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	.max_hw_frame_size	= 4096,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	.get_variants		= e1000_get_variants_ich8lan,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	.mac_ops		= &ich8_mac_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
	.phy_ops		= &ich8_phy_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	.nvm_ops		= &ich8_nvm_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
};