devices/e1000/e1000_hw-2.6.24-ethercat.c
author Florian Pose <fp@igh-essen.com>
Fri, 16 Sep 2016 11:56:10 +0200
branchstable-1.5
changeset 2655 a5c9005fe7a8
parent 898 9fe5df8b3a98
permissions -rw-r--r--
Always clear PDO mapping in ecrt_slave_config_pdos().
898
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2006 Intel Corporation.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
/* e1000_hw.c
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 * Shared functions for accessing and configuring the MAC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include "e1000_hw-2.6.24-ethercat.h"
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
static int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
static void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
static int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
static int32_t e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
static int32_t e1000_get_software_semaphore(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
static void e1000_release_software_semaphore(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
static uint8_t e1000_arc_subsystem_valid(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
static int32_t e1000_check_downshift(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
static int32_t e1000_check_polarity(struct e1000_hw *hw, e1000_rev_polarity *polarity);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
static void e1000_clear_hw_cntrs(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
static void e1000_clear_vfta(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
static int32_t e1000_commit_shadow_ram(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
static int32_t e1000_config_dsp_after_link_change(struct e1000_hw *hw, boolean_t link_up);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
static int32_t e1000_config_fc_after_link_up(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
static int32_t e1000_detect_gig_phy(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
static int32_t e1000_erase_ich8_4k_segment(struct e1000_hw *hw, uint32_t bank);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
static int32_t e1000_get_auto_rd_done(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
static int32_t e1000_get_cable_length(struct e1000_hw *hw, uint16_t *min_length, uint16_t *max_length);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
static int32_t e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
static int32_t e1000_get_phy_cfg_done(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
static int32_t e1000_get_software_flag(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
static int32_t e1000_ich8_cycle_init(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
static int32_t e1000_ich8_flash_cycle(struct e1000_hw *hw, uint32_t timeout);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
static int32_t e1000_id_led_init(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
static int32_t e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw, uint32_t cnf_base_addr, uint32_t cnf_size);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
static int32_t e1000_init_lcd_from_nvm(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
static void e1000_init_rx_addrs(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
static void e1000_initialize_hardware_bits(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
static boolean_t e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
static int32_t e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
static int32_t e1000_mng_enable_host_if(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
static int32_t e1000_mng_host_if_write(struct e1000_hw *hw, uint8_t *buffer, uint16_t length, uint16_t offset, uint8_t *sum);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
static int32_t e1000_mng_write_cmd_header(struct e1000_hw* hw, struct e1000_host_mng_command_header* hdr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
static int32_t e1000_mng_write_commit(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
static int32_t e1000_phy_ife_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
static int32_t e1000_phy_igp_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
static int32_t e1000_read_eeprom_eerd(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
static int32_t e1000_write_eeprom_eewr(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
static int32_t e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
static int32_t e1000_phy_m88_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
static int32_t e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
static int32_t e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
static int32_t e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
static int32_t e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
static int32_t e1000_read_ich8_data(struct e1000_hw *hw, uint32_t index, uint32_t size, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
static int32_t e1000_write_ich8_data(struct e1000_hw *hw, uint32_t index, uint32_t size, uint16_t data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
static int32_t e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
static int32_t e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
static void e1000_release_software_flag(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
static int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
static int32_t e1000_set_d0_lplu_state(struct e1000_hw *hw, boolean_t active);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
static int32_t e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, uint32_t no_snoop);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
static void e1000_set_pci_express_master_disable(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
static int32_t e1000_wait_autoneg(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
static void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, uint32_t value);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
static int32_t e1000_set_phy_type(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
static void e1000_phy_init_script(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
static int32_t e1000_setup_copper_link(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
static int32_t e1000_setup_fiber_serdes_link(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
static int32_t e1000_adjust_serdes_amplitude(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
static int32_t e1000_phy_force_speed_duplex(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
static int32_t e1000_config_mac_to_phy(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
static void e1000_raise_mdi_clk(struct e1000_hw *hw, uint32_t *ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
static void e1000_lower_mdi_clk(struct e1000_hw *hw, uint32_t *ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, uint32_t data,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
                                     uint16_t count);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
static uint16_t e1000_shift_in_mdi_bits(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
static int32_t e1000_phy_reset_dsp(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
static int32_t e1000_write_eeprom_spi(struct e1000_hw *hw, uint16_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
                                      uint16_t words, uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
static int32_t e1000_write_eeprom_microwire(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
                                            uint16_t offset, uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
                                            uint16_t *data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
static int32_t e1000_spi_eeprom_ready(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
static void e1000_raise_ee_clk(struct e1000_hw *hw, uint32_t *eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
static void e1000_lower_ee_clk(struct e1000_hw *hw, uint32_t *eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
static void e1000_shift_out_ee_bits(struct e1000_hw *hw, uint16_t data,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
                                    uint16_t count);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
static int32_t e1000_write_phy_reg_ex(struct e1000_hw *hw, uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
                                      uint16_t phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
static int32_t e1000_read_phy_reg_ex(struct e1000_hw *hw,uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
                                     uint16_t *phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
static uint16_t e1000_shift_in_ee_bits(struct e1000_hw *hw, uint16_t count);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
static int32_t e1000_acquire_eeprom(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
static void e1000_release_eeprom(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
static void e1000_standby_eeprom(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
static int32_t e1000_set_vco_speed(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
static int32_t e1000_polarity_reversal_workaround(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
static int32_t e1000_set_phy_mode(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
static int32_t e1000_host_if_read_cookie(struct e1000_hw *hw, uint8_t *buffer);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
static uint8_t e1000_calculate_mng_checksum(char *buffer, uint32_t length);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
static int32_t e1000_configure_kmrn_for_10_100(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
                                               uint16_t duplex);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
static int32_t e1000_configure_kmrn_for_1000(struct e1000_hw *hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
/* IGP cable length table */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
static const
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
uint16_t e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
    { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
      5, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 25, 25, 25,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
      25, 25, 25, 25, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40, 40, 40,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
      40, 50, 50, 50, 50, 50, 50, 50, 60, 60, 60, 60, 60, 60, 60, 60,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
      60, 70, 70, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 90, 90, 90,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
      90, 90, 90, 90, 90, 90, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
      100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
      110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120};
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
static const
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
uint16_t e1000_igp_2_cable_length_table[IGP02E1000_AGC_LENGTH_TABLE_SIZE] =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
    { 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 18, 21,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
      0, 0, 0, 3, 6, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
      6, 10, 14, 18, 22, 26, 30, 33, 37, 41, 44, 48, 51, 54, 58, 61,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
      21, 26, 31, 35, 40, 44, 49, 53, 57, 61, 65, 68, 72, 75, 79, 82,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
      40, 45, 51, 56, 61, 66, 70, 75, 79, 83, 87, 91, 94, 98, 101, 104,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
      60, 66, 72, 77, 82, 87, 92, 96, 100, 104, 108, 111, 114, 117, 119, 121,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
      83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
      104, 109, 114, 118, 121, 124};
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
 * Set the phy type member in the hw struct.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
e1000_set_phy_type(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
    DEBUGFUNC("e1000_set_phy_type");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
    if (hw->mac_type == e1000_undefined)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
        return -E1000_ERR_PHY_TYPE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
    switch (hw->phy_id) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
    case M88E1000_E_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
    case M88E1000_I_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
    case M88E1011_I_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
    case M88E1111_I_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
        hw->phy_type = e1000_phy_m88;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
    case IGP01E1000_I_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
        if (hw->mac_type == e1000_82541 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
            hw->mac_type == e1000_82541_rev_2 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
            hw->mac_type == e1000_82547 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
            hw->mac_type == e1000_82547_rev_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
            hw->phy_type = e1000_phy_igp;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
    case IGP03E1000_E_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
        hw->phy_type = e1000_phy_igp_3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
    case IFE_E_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
    case IFE_PLUS_E_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
    case IFE_C_E_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
        hw->phy_type = e1000_phy_ife;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
    case GG82563_E_PHY_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
        if (hw->mac_type == e1000_80003es2lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
            hw->phy_type = e1000_phy_gg82563;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
        /* Fall Through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
        /* Should never have loaded on this device */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
        hw->phy_type = e1000_phy_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
        return -E1000_ERR_PHY_TYPE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
 * IGP phy init script - initializes the GbE PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
e1000_phy_init_script(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
    uint32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
    uint16_t phy_saved_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
    DEBUGFUNC("e1000_phy_init_script");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
    if (hw->phy_init_script) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
        msleep(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
        /* Save off the current value of register 0x2F5B to be restored at
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
         * the end of this routine. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
        ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
        /* Disabled the PHY transmitter */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
        e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
        msleep(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
        e1000_write_phy_reg(hw,0x0000,0x0140);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
        msleep(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
        switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
        case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
        case e1000_82547:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
            e1000_write_phy_reg(hw, 0x1F95, 0x0001);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
            e1000_write_phy_reg(hw, 0x1F71, 0xBD21);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
            e1000_write_phy_reg(hw, 0x1F79, 0x0018);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
            e1000_write_phy_reg(hw, 0x1F30, 0x1600);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
            e1000_write_phy_reg(hw, 0x1F31, 0x0014);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
            e1000_write_phy_reg(hw, 0x1F32, 0x161C);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
            e1000_write_phy_reg(hw, 0x1F94, 0x0003);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
            e1000_write_phy_reg(hw, 0x1F96, 0x003F);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
            e1000_write_phy_reg(hw, 0x2010, 0x0008);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
        case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
        case e1000_82547_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
            e1000_write_phy_reg(hw, 0x1F73, 0x0099);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
        e1000_write_phy_reg(hw, 0x0000, 0x3300);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
        msleep(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
        /* Now enable the transmitter */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
        e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
        if (hw->mac_type == e1000_82547) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
            uint16_t fused, fine, coarse;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
            /* Move to analog registers page */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
            e1000_read_phy_reg(hw, IGP01E1000_ANALOG_SPARE_FUSE_STATUS, &fused);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
            if (!(fused & IGP01E1000_ANALOG_SPARE_FUSE_ENABLED)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
                e1000_read_phy_reg(hw, IGP01E1000_ANALOG_FUSE_STATUS, &fused);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
                fine = fused & IGP01E1000_ANALOG_FUSE_FINE_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
                coarse = fused & IGP01E1000_ANALOG_FUSE_COARSE_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
                if (coarse > IGP01E1000_ANALOG_FUSE_COARSE_THRESH) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
                    coarse -= IGP01E1000_ANALOG_FUSE_COARSE_10;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
                    fine -= IGP01E1000_ANALOG_FUSE_FINE_1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
                } else if (coarse == IGP01E1000_ANALOG_FUSE_COARSE_THRESH)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
                    fine -= IGP01E1000_ANALOG_FUSE_FINE_10;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
                fused = (fused & IGP01E1000_ANALOG_FUSE_POLY_MASK) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
                        (fine & IGP01E1000_ANALOG_FUSE_FINE_MASK) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
                        (coarse & IGP01E1000_ANALOG_FUSE_COARSE_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
                e1000_write_phy_reg(hw, IGP01E1000_ANALOG_FUSE_CONTROL, fused);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
                e1000_write_phy_reg(hw, IGP01E1000_ANALOG_FUSE_BYPASS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
                                    IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
 * Set the mac type member in the hw struct.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
e1000_set_mac_type(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	DEBUGFUNC("e1000_set_mac_type");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	switch (hw->device_id) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	case E1000_DEV_ID_82542:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
		switch (hw->revision_id) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
		case E1000_82542_2_0_REV_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
			hw->mac_type = e1000_82542_rev2_0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
			break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
		case E1000_82542_2_1_REV_ID:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
			hw->mac_type = e1000_82542_rev2_1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
			break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
		default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
			/* Invalid 82542 revision ID */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
			return -E1000_ERR_MAC_TYPE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
		}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	case E1000_DEV_ID_82543GC_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	case E1000_DEV_ID_82543GC_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
		hw->mac_type = e1000_82543;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	case E1000_DEV_ID_82544EI_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	case E1000_DEV_ID_82544EI_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	case E1000_DEV_ID_82544GC_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	case E1000_DEV_ID_82544GC_LOM:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
		hw->mac_type = e1000_82544;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	case E1000_DEV_ID_82540EM:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	case E1000_DEV_ID_82540EM_LOM:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	case E1000_DEV_ID_82540EP:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	case E1000_DEV_ID_82540EP_LOM:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	case E1000_DEV_ID_82540EP_LP:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
		hw->mac_type = e1000_82540;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	case E1000_DEV_ID_82545EM_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	case E1000_DEV_ID_82545EM_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
		hw->mac_type = e1000_82545;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	case E1000_DEV_ID_82545GM_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	case E1000_DEV_ID_82545GM_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	case E1000_DEV_ID_82545GM_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
		hw->mac_type = e1000_82545_rev_3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	case E1000_DEV_ID_82546EB_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	case E1000_DEV_ID_82546EB_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	case E1000_DEV_ID_82546EB_QUAD_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
		hw->mac_type = e1000_82546;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	case E1000_DEV_ID_82546GB_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	case E1000_DEV_ID_82546GB_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	case E1000_DEV_ID_82546GB_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	case E1000_DEV_ID_82546GB_PCIE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	case E1000_DEV_ID_82546GB_QUAD_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
		hw->mac_type = e1000_82546_rev_3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	case E1000_DEV_ID_82541EI:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	case E1000_DEV_ID_82541EI_MOBILE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	case E1000_DEV_ID_82541ER_LOM:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
		hw->mac_type = e1000_82541;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	case E1000_DEV_ID_82541ER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	case E1000_DEV_ID_82541GI:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	case E1000_DEV_ID_82541GI_LF:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	case E1000_DEV_ID_82541GI_MOBILE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
		hw->mac_type = e1000_82541_rev_2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	case E1000_DEV_ID_82547EI:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	case E1000_DEV_ID_82547EI_MOBILE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
		hw->mac_type = e1000_82547;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	case E1000_DEV_ID_82547GI:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
		hw->mac_type = e1000_82547_rev_2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	case E1000_DEV_ID_82571EB_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	case E1000_DEV_ID_82571EB_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	case E1000_DEV_ID_82571EB_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	case E1000_DEV_ID_82571EB_SERDES_DUAL:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	case E1000_DEV_ID_82571EB_SERDES_QUAD:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	case E1000_DEV_ID_82571EB_QUAD_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	case E1000_DEV_ID_82571PT_QUAD_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	case E1000_DEV_ID_82571EB_QUAD_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
		hw->mac_type = e1000_82571;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	case E1000_DEV_ID_82572EI_COPPER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	case E1000_DEV_ID_82572EI_FIBER:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	case E1000_DEV_ID_82572EI_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	case E1000_DEV_ID_82572EI:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
		hw->mac_type = e1000_82572;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	case E1000_DEV_ID_82573E:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	case E1000_DEV_ID_82573E_IAMT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	case E1000_DEV_ID_82573L:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
		hw->mac_type = e1000_82573;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	case E1000_DEV_ID_80003ES2LAN_COPPER_SPT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	case E1000_DEV_ID_80003ES2LAN_SERDES_SPT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
		hw->mac_type = e1000_80003es2lan;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	case E1000_DEV_ID_ICH8_IGP_M_AMT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	case E1000_DEV_ID_ICH8_IGP_AMT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	case E1000_DEV_ID_ICH8_IGP_C:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	case E1000_DEV_ID_ICH8_IFE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	case E1000_DEV_ID_ICH8_IFE_GT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	case E1000_DEV_ID_ICH8_IFE_G:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	case E1000_DEV_ID_ICH8_IGP_M:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
		hw->mac_type = e1000_ich8lan;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
		/* Should never have loaded on this device */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
		return -E1000_ERR_MAC_TYPE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
		hw->swfwhw_semaphore_present = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
		hw->asf_firmware_present = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
		hw->swfw_sync_present = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
		/* fall through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
		hw->eeprom_semaphore_present = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
		/* fall through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	case e1000_82547:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	case e1000_82547_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
		hw->asf_firmware_present = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
		break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	/* The 82543 chip does not count tx_carrier_errors properly in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	 * FD mode
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	if (hw->mac_type == e1000_82543)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
		hw->bad_tx_carr_stats_fd = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	/* capable of receiving management packets to the host */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	if (hw->mac_type >= e1000_82571)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
		hw->has_manc2h = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	/* In rare occasions, ESB2 systems would end up started without
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	 * the RX unit being turned on.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	if (hw->mac_type == e1000_80003es2lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
		hw->rx_needs_kicking = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	if (hw->mac_type > e1000_82544)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
		hw->has_smbus = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
 * Set media type and TBI compatibility.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
 * **************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
e1000_set_media_type(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
    uint32_t status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
    DEBUGFUNC("e1000_set_media_type");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
    if (hw->mac_type != e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
        /* tbi_compatibility is only valid on 82543 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
        hw->tbi_compatibility_en = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
    switch (hw->device_id) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
    case E1000_DEV_ID_82545GM_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
    case E1000_DEV_ID_82546GB_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
    case E1000_DEV_ID_82571EB_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
    case E1000_DEV_ID_82571EB_SERDES_DUAL:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
    case E1000_DEV_ID_82571EB_SERDES_QUAD:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
    case E1000_DEV_ID_82572EI_SERDES:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
    case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
        hw->media_type = e1000_media_type_internal_serdes;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
        switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
        case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
        case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
            hw->media_type = e1000_media_type_fiber;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
        case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
        case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
            /* The STATUS_TBIMODE bit is reserved or reused for the this
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
             * device.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
            hw->media_type = e1000_media_type_copper;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
            status = E1000_READ_REG(hw, STATUS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
            if (status & E1000_STATUS_TBIMODE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
                hw->media_type = e1000_media_type_fiber;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
                /* tbi_compatibility not valid on fiber */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
                hw->tbi_compatibility_en = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
                hw->media_type = e1000_media_type_copper;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
 * Reset the transmit and receive units; mask and clear all interrupts.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
e1000_reset_hw(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
    uint32_t ctrl_ext;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
    uint32_t icr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
    uint32_t manc;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
    uint32_t led_ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
    uint32_t timeout;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
    uint32_t extcnf_ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
    DEBUGFUNC("e1000_reset_hw");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
    /* For 82542 (rev 2.0), disable MWI before issuing a device reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
    if (hw->mac_type == e1000_82542_rev2_0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
        DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
        e1000_pci_clear_mwi(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
    if (hw->bus_type == e1000_bus_type_pci_express) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
        /* Prevent the PCI-E bus from sticking if there is no TLP connection
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
         * on the last TLP read/write transaction when MAC is reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
        if (e1000_disable_pciex_master(hw) != E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
            DEBUGOUT("PCI-E Master disable polling has failed.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
    /* Clear interrupt mask to stop board from generating interrupts */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
    DEBUGOUT("Masking off all interrupts\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
    E1000_WRITE_REG(hw, IMC, 0xffffffff);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
    /* Disable the Transmit and Receive units.  Then delay to allow
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
     * any pending transactions to complete before we hit the MAC with
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
     * the global reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
    E1000_WRITE_REG(hw, RCTL, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
    E1000_WRITE_REG(hw, TCTL, E1000_TCTL_PSP);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
    /* The tbi_compatibility_on Flag must be cleared when Rctl is cleared. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
    hw->tbi_compatibility_on = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
    /* Delay to allow any outstanding PCI transactions to complete before
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
     * resetting the device
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
    msleep(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
    /* Must reset the PHY before resetting the MAC */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
    if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
        E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_PHY_RST));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
        msleep(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
    /* Must acquire the MDIO ownership before MAC reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
     * Ownership defaults to firmware after a reset. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
    if (hw->mac_type == e1000_82573) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
        timeout = 10;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
        extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
        extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
        do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
            E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
            extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
            if (extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
            else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
                extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
            msleep(2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
            timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
        } while (timeout);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
    /* Workaround for ICH8 bit corruption issue in FIFO memory */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
        /* Set Tx and Rx buffer allocation to 8k apiece. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
        E1000_WRITE_REG(hw, PBA, E1000_PBA_8K);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
        /* Set Packet Buffer Size to 16k. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
        E1000_WRITE_REG(hw, PBS, E1000_PBS_16K);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
    /* Issue a global reset to the MAC.  This will reset the chip's
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
     * transmit, receive, DMA, and link units.  It will not effect
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
     * the current PCI configuration.  The global reset bit is self-
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
     * clearing, and should clear within a microsecond.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
    DEBUGOUT("Issuing a global reset to MAC\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
        case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
        case e1000_82540:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
        case e1000_82545:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
        case e1000_82546:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
        case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
        case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
            /* These controllers can't ack the 64-bit write when issuing the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
             * reset, so use IO-mapping as a workaround to issue the reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
            E1000_WRITE_REG_IO(hw, CTRL, (ctrl | E1000_CTRL_RST));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
        case e1000_82545_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
        case e1000_82546_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
            /* Reset is performed on a shadow of the control register */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
            E1000_WRITE_REG(hw, CTRL_DUP, (ctrl | E1000_CTRL_RST));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
        case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
            if (!hw->phy_reset_disable &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
                e1000_check_phy_reset_block(hw) == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
                /* e1000_ich8lan PHY HW reset requires MAC CORE reset
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
                 * at the same time to make sure the interface between
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
                 * MAC and the external PHY is reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
                 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
                ctrl |= E1000_CTRL_PHY_RST;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
            e1000_get_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
            E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
            msleep(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
            E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
    /* After MAC reset, force reload of EEPROM to restore power-on settings to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
     * device.  Later controllers reload the EEPROM automatically, so just wait
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
     * for reload to complete.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
        case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
        case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
        case e1000_82543:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
        case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
            /* Wait for reset to complete */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
            udelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
            ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
            ctrl_ext |= E1000_CTRL_EXT_EE_RST;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
            E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
            E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
            /* Wait for EEPROM reload */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
            msleep(2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
        case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
        case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
        case e1000_82547:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
        case e1000_82547_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
            /* Wait for EEPROM reload */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
            msleep(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
        case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
            if (e1000_is_onboard_nvm_eeprom(hw) == FALSE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
                udelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
                ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
                ctrl_ext |= E1000_CTRL_EXT_EE_RST;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
                E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
                E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
            /* fall through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
            /* Auto read done will delay 5ms or poll based on mac type */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
            ret_val = e1000_get_auto_rd_done(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
    /* Disable HW ARPs on ASF enabled adapters */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
    if (hw->mac_type >= e1000_82540 && hw->mac_type <= e1000_82547_rev_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
        manc = E1000_READ_REG(hw, MANC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
        manc &= ~(E1000_MANC_ARP_EN);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
        E1000_WRITE_REG(hw, MANC, manc);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
    if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
        e1000_phy_init_script(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
        /* Configure activity LED after PHY reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
        led_ctrl = E1000_READ_REG(hw, LEDCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
        led_ctrl &= IGP_ACTIVITY_LED_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
        led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
        E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
    /* Clear interrupt mask to stop board from generating interrupts */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
    DEBUGOUT("Masking off all interrupts\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
    E1000_WRITE_REG(hw, IMC, 0xffffffff);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
    /* Clear any pending interrupt events. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
    icr = E1000_READ_REG(hw, ICR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
    /* If MWI was previously enabled, reenable it. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
    if (hw->mac_type == e1000_82542_rev2_0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
        if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
            e1000_pci_set_mwi(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
        uint32_t kab = E1000_READ_REG(hw, KABGTXD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
        kab |= E1000_KABGTXD_BGSQLBIAS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
        E1000_WRITE_REG(hw, KABGTXD, kab);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
 * Initialize a number of hardware-dependent bits
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
 * This function contains hardware limitation workarounds for PCI-E adapters
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
e1000_initialize_hardware_bits(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
    if ((hw->mac_type >= e1000_82571) && (!hw->initialize_hw_bits_disable)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
        /* Settings common to all PCI-express silicon */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
        uint32_t reg_ctrl, reg_ctrl_ext;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
        uint32_t reg_tarc0, reg_tarc1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
        uint32_t reg_tctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
        uint32_t reg_txdctl, reg_txdctl1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
        /* link autonegotiation/sync workarounds */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
        reg_tarc0 = E1000_READ_REG(hw, TARC0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
        reg_tarc0 &= ~((1 << 30)|(1 << 29)|(1 << 28)|(1 << 27));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
        /* Enable not-done TX descriptor counting */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
        reg_txdctl = E1000_READ_REG(hw, TXDCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
        reg_txdctl |= E1000_TXDCTL_COUNT_DESC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
        E1000_WRITE_REG(hw, TXDCTL, reg_txdctl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
        reg_txdctl1 = E1000_READ_REG(hw, TXDCTL1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
        reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
        E1000_WRITE_REG(hw, TXDCTL1, reg_txdctl1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
        switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
            case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
            case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
                /* Clear PHY TX compatible mode bits */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
                reg_tarc1 = E1000_READ_REG(hw, TARC1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
                reg_tarc1 &= ~((1 << 30)|(1 << 29));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
                /* link autonegotiation/sync workarounds */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
                reg_tarc0 |= ((1 << 26)|(1 << 25)|(1 << 24)|(1 << 23));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
                /* TX ring control fixes */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
                reg_tarc1 |= ((1 << 26)|(1 << 25)|(1 << 24));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
                /* Multiple read bit is reversed polarity */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
                reg_tctl = E1000_READ_REG(hw, TCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
                if (reg_tctl & E1000_TCTL_MULR)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
                    reg_tarc1 &= ~(1 << 28);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
                else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
                    reg_tarc1 |= (1 << 28);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
                E1000_WRITE_REG(hw, TARC1, reg_tarc1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
            case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
                reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
                reg_ctrl_ext &= ~(1 << 23);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
                reg_ctrl_ext |= (1 << 22);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
                /* TX byte count fix */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
                reg_ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
                reg_ctrl &= ~(1 << 29);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
                E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
                E1000_WRITE_REG(hw, CTRL, reg_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
            case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
                /* improve small packet performace for fiber/serdes */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
                if ((hw->media_type == e1000_media_type_fiber) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
                    (hw->media_type == e1000_media_type_internal_serdes)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
                    reg_tarc0 &= ~(1 << 20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
                /* Multiple read bit is reversed polarity */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
                reg_tctl = E1000_READ_REG(hw, TCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
                reg_tarc1 = E1000_READ_REG(hw, TARC1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
                if (reg_tctl & E1000_TCTL_MULR)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
                    reg_tarc1 &= ~(1 << 28);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
                else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
                    reg_tarc1 |= (1 << 28);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
                E1000_WRITE_REG(hw, TARC1, reg_tarc1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
            case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
                /* Reduce concurrent DMA requests to 3 from 4 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
                if ((hw->revision_id < 3) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
                    ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
                     (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
                    reg_tarc0 |= ((1 << 29)|(1 << 28));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
                reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
                reg_ctrl_ext |= (1 << 22);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
                E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
                /* workaround TX hang with TSO=on */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
                reg_tarc0 |= ((1 << 27)|(1 << 26)|(1 << 24)|(1 << 23));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
                /* Multiple read bit is reversed polarity */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
                reg_tctl = E1000_READ_REG(hw, TCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
                reg_tarc1 = E1000_READ_REG(hw, TARC1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
                if (reg_tctl & E1000_TCTL_MULR)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
                    reg_tarc1 &= ~(1 << 28);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
                else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
                    reg_tarc1 |= (1 << 28);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
                /* workaround TX hang with TSO=on */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
                reg_tarc1 |= ((1 << 30)|(1 << 26)|(1 << 24));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
                E1000_WRITE_REG(hw, TARC1, reg_tarc1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
            default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
        E1000_WRITE_REG(hw, TARC0, reg_tarc0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
 * Performs basic configuration of the adapter.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
 * Assumes that the controller has previously been reset and is in a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
 * post-reset uninitialized state. Initializes the receive address registers,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
 * multicast table, and VLAN filter table. Calls routines to setup link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
 * configuration and flow control settings. Clears all on-chip counters. Leaves
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
 * the transmit and receive units disabled and uninitialized.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
e1000_init_hw(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
    uint32_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
    uint32_t mta_size;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
    uint32_t reg_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
    uint32_t ctrl_ext;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
    DEBUGFUNC("e1000_init_hw");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
    /* force full DMA clock frequency for 10/100 on ICH8 A0-B0 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
    if ((hw->mac_type == e1000_ich8lan) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
        ((hw->revision_id < 3) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
         ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
          (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
            reg_data = E1000_READ_REG(hw, STATUS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
            reg_data &= ~0x80000000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
            E1000_WRITE_REG(hw, STATUS, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
    /* Initialize Identification LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
    ret_val = e1000_id_led_init(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
        DEBUGOUT("Error Initializing Identification LED\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
    /* Set the media type and TBI compatibility */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
    e1000_set_media_type(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
    /* Must be called after e1000_set_media_type because media_type is used */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
    e1000_initialize_hardware_bits(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
    /* Disabling VLAN filtering. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
    DEBUGOUT("Initializing the IEEE VLAN\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
    /* VET hardcoded to standard value and VFTA removed in ICH8 LAN */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
    if (hw->mac_type != e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
        if (hw->mac_type < e1000_82545_rev_3)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
            E1000_WRITE_REG(hw, VET, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
        e1000_clear_vfta(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
    /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
    if (hw->mac_type == e1000_82542_rev2_0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
        DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
        e1000_pci_clear_mwi(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
        E1000_WRITE_REG(hw, RCTL, E1000_RCTL_RST);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
        msleep(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
    /* Setup the receive address. This involves initializing all of the Receive
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
     * Address Registers (RARs 0 - 15).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
    e1000_init_rx_addrs(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
    /* For 82542 (rev 2.0), take the receiver out of reset and enable MWI */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
    if (hw->mac_type == e1000_82542_rev2_0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
        E1000_WRITE_REG(hw, RCTL, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
        msleep(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
        if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
            e1000_pci_set_mwi(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
    /* Zero out the Multicast HASH table */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
    DEBUGOUT("Zeroing the MTA\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
    mta_size = E1000_MC_TBL_SIZE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
        mta_size = E1000_MC_TBL_SIZE_ICH8LAN;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
    for (i = 0; i < mta_size; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
        E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
        /* use write flush to prevent Memory Write Block (MWB) from
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
         * occuring when accessing our register space */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
    /* Set the PCI priority bit correctly in the CTRL register.  This
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
     * determines if the adapter gives priority to receives, or if it
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
     * gives equal priority to transmits and receives.  Valid only on
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
     * 82542 and 82543 silicon.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
    if (hw->dma_fairness && hw->mac_type <= e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
        ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
        E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PRIOR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
    case e1000_82545_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
    case e1000_82546_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
        /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
	if (hw->bus_type == e1000_bus_type_pcix && e1000_pcix_get_mmrbc(hw) > 2048)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
		e1000_pcix_set_mmrbc(hw, 2048);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
	break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
    /* More time needed for PHY to initialize */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
        msleep(15);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
    /* Call a subroutine to configure the link and setup flow control. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
    ret_val = e1000_setup_link(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
    /* Set the transmit descriptor write-back policy */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
    if (hw->mac_type > e1000_82544) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
        ctrl = E1000_READ_REG(hw, TXDCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
        ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
        E1000_WRITE_REG(hw, TXDCTL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
    if (hw->mac_type == e1000_82573) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
        e1000_enable_tx_pkt_filtering(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
        /* Enable retransmit on late collisions */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
        reg_data = E1000_READ_REG(hw, TCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
        reg_data |= E1000_TCTL_RTLC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
        E1000_WRITE_REG(hw, TCTL, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
        /* Configure Gigabit Carry Extend Padding */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
        reg_data = E1000_READ_REG(hw, TCTL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
        reg_data &= ~E1000_TCTL_EXT_GCEX_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
        reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
        E1000_WRITE_REG(hw, TCTL_EXT, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
        /* Configure Transmit Inter-Packet Gap */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
        reg_data = E1000_READ_REG(hw, TIPG);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
        reg_data &= ~E1000_TIPG_IPGT_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
        reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
        E1000_WRITE_REG(hw, TIPG, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
        reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
        reg_data &= ~0x00100000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
        E1000_WRITE_REG_ARRAY(hw, FFLT, 0x0001, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
        /* Fall through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
    case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
    case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
        ctrl = E1000_READ_REG(hw, TXDCTL1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
        ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
        E1000_WRITE_REG(hw, TXDCTL1, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
    if (hw->mac_type == e1000_82573) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
        uint32_t gcr = E1000_READ_REG(hw, GCR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
        gcr |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
        E1000_WRITE_REG(hw, GCR, gcr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
    /* Clear all of the statistics registers (clear on read).  It is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
     * important that we do this after we have tried to establish link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
     * because the symbol error count will increment wildly if there
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
     * is no link.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
    e1000_clear_hw_cntrs(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
    /* ICH8 No-snoop bits are opposite polarity.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
     * Set to snoop by default after reset. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
        e1000_set_pci_ex_no_snoop(hw, PCI_EX_82566_SNOOP_ALL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
    if (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
        hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
        ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
        /* Relaxed ordering must be disabled to avoid a parity
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
         * error crash in a PCI slot. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
        ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
        E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
 * Adjust SERDES output amplitude based on EEPROM setting.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
 * hw - Struct containing variables accessed by shared code.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
e1000_adjust_serdes_amplitude(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
    uint16_t eeprom_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
    int32_t  ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
    DEBUGFUNC("e1000_adjust_serdes_amplitude");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
    if (hw->media_type != e1000_media_type_internal_serdes)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
    case e1000_82545_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
    case e1000_82546_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
    ret_val = e1000_read_eeprom(hw, EEPROM_SERDES_AMPLITUDE, 1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
    if (eeprom_data != EEPROM_RESERVED_WORD) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
        /* Adjust SERDES output amplitude only. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
        eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
 * Configures flow control and link settings.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
 * Determines which flow control settings to use. Calls the apropriate media-
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
 * specific link configuration function. Configures the flow control settings.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
 * Assuming the adapter has a valid link partner, a valid link should be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
 * established. Assumes the hardware has previously been reset and the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
 * transmitter and receiver are not enabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
e1000_setup_link(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
    uint32_t ctrl_ext;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
    uint16_t eeprom_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
    DEBUGFUNC("e1000_setup_link");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
    /* In the case of the phy reset being blocked, we already have a link.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
     * We do not have to set it up again. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
    if (e1000_check_phy_reset_block(hw))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
    /* Read and store word 0x0F of the EEPROM. This word contains bits
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
     * that determine the hardware's default PAUSE (flow control) mode,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
     * a bit that determines whether the HW defaults to enabling or
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
     * disabling auto-negotiation, and the direction of the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
     * SW defined pins. If there is no SW over-ride of the flow
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
     * control setting, then the variable hw->fc will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
     * be initialized based on a value in the EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
    if (hw->fc == E1000_FC_DEFAULT) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
        switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
        case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
        case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
            hw->fc = E1000_FC_FULL;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
            ret_val = e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
                                        1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
                DEBUGOUT("EEPROM Read Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
                return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
            if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
                hw->fc = E1000_FC_NONE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
            else if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) ==
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
                    EEPROM_WORD0F_ASM_DIR)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
                hw->fc = E1000_FC_TX_PAUSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
            else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
                hw->fc = E1000_FC_FULL;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
    /* We want to save off the original Flow Control configuration just
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
     * in case we get disconnected and then reconnected into a different
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
     * hub or switch with different Flow Control capabilities.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
    if (hw->mac_type == e1000_82542_rev2_0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
        hw->fc &= (~E1000_FC_TX_PAUSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
    if ((hw->mac_type < e1000_82543) && (hw->report_tx_early == 1))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
        hw->fc &= (~E1000_FC_RX_PAUSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
    hw->original_fc = hw->fc;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
    DEBUGOUT1("After fix-ups FlowControl is now = %x\n", hw->fc);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
    /* Take the 4 bits from EEPROM word 0x0F that determine the initial
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
     * polarity value for the SW controlled pins, and setup the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
     * Extended Device Control reg with that info.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
     * This is needed because one of the SW controlled pins is used for
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
     * signal detection.  So this should be done before e1000_setup_pcs_link()
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
     * or e1000_phy_setup() is called.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
    if (hw->mac_type == e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
        ret_val = e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
                                    1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
            DEBUGOUT("EEPROM Read Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
        ctrl_ext = ((eeprom_data & EEPROM_WORD0F_SWPDIO_EXT) <<
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
                    SWDPIO__EXT_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
        E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
    /* Call the necessary subroutine to configure the link. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
    ret_val = (hw->media_type == e1000_media_type_copper) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
              e1000_setup_copper_link(hw) :
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
              e1000_setup_fiber_serdes_link(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
    /* Initialize the flow control address, type, and PAUSE timer
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
     * registers to their default values.  This is done even if flow
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
     * control is disabled, because it does not hurt anything to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
     * initialize these registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
    DEBUGOUT("Initializing the Flow Control address, type and timer regs\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
    /* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
    if (hw->mac_type != e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
        E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
        E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
        E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
    E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
    /* Set the flow control receive threshold registers.  Normally,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
     * these registers will be set to a default threshold that may be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
     * adjusted later by the driver's runtime code.  However, if the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
     * ability to transmit pause frames in not enabled, then these
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
     * registers will be set to 0.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
    if (!(hw->fc & E1000_FC_TX_PAUSE)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
        E1000_WRITE_REG(hw, FCRTL, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
        E1000_WRITE_REG(hw, FCRTH, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
        /* We need to set up the Receive Threshold high and low water marks
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
         * as well as (optionally) enabling the transmission of XON frames.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
        if (hw->fc_send_xon) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
            E1000_WRITE_REG(hw, FCRTL, (hw->fc_low_water | E1000_FCRTL_XONE));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
            E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
            E1000_WRITE_REG(hw, FCRTL, hw->fc_low_water);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
            E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
 * Sets up link for a fiber based or serdes based adapter
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
 * Manipulates Physical Coding Sublayer functions in order to configure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
 * link. Assumes the hardware has been previously reset and the transmitter
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
 * and receiver are not enabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
    uint32_t status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
    uint32_t txcw = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
    uint32_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
    uint32_t signal = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
    DEBUGFUNC("e1000_setup_fiber_serdes_link");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
    /* On 82571 and 82572 Fiber connections, SerDes loopback mode persists
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
     * until explicitly turned off or a power cycle is performed.  A read to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
     * the register does not indicate its status.  Therefore, we ensure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
     * loopback mode is disabled during initialization.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
    if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
        E1000_WRITE_REG(hw, SCTL, E1000_DISABLE_SERDES_LOOPBACK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
    /* On adapters with a MAC newer than 82544, SWDP 1 will be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
     * set when the optics detect a signal. On older adapters, it will be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
     * cleared when there is a signal.  This applies to fiber media only.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
     * If we're on serdes media, adjust the output amplitude to value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
     * set in the EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
    if (hw->media_type == e1000_media_type_fiber)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
        signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
    ret_val = e1000_adjust_serdes_amplitude(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
    /* Take the link out of reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
    ctrl &= ~(E1000_CTRL_LRST);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
    /* Adjust VCO speed to improve BER performance */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
    ret_val = e1000_set_vco_speed(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
    e1000_config_collision_dist(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
    /* Check for a software override of the flow control settings, and setup
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
     * the device accordingly.  If auto-negotiation is enabled, then software
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
     * will have to set the "PAUSE" bits to the correct value in the Tranmsit
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
     * Config Word Register (TXCW) and re-start auto-negotiation.  However, if
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
     * auto-negotiation is disabled, then software will have to manually
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
     * configure the two flow control enable bits in the CTRL register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
     *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
     * The possible values of the "fc" parameter are:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
     *      0:  Flow control is completely disabled
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
     *      1:  Rx flow control is enabled (we can receive pause frames, but
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
     *          not send pause frames).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
     *      2:  Tx flow control is enabled (we can send pause frames but we do
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
     *          not support receiving pause frames).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
     *      3:  Both Rx and TX flow control (symmetric) are enabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
    switch (hw->fc) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
    case E1000_FC_NONE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
        /* Flow control is completely disabled by a software over-ride. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
        txcw = (E1000_TXCW_ANE | E1000_TXCW_FD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
    case E1000_FC_RX_PAUSE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
        /* RX Flow control is enabled and TX Flow control is disabled by a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
         * software over-ride. Since there really isn't a way to advertise
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
         * that we are capable of RX Pause ONLY, we will advertise that we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
         * support both symmetric and asymmetric RX PAUSE. Later, we will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
         *  disable the adapter's ability to send PAUSE frames.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
        txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
    case E1000_FC_TX_PAUSE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
        /* TX Flow control is enabled, and RX Flow control is disabled, by a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
         * software over-ride.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
        txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
    case E1000_FC_FULL:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
        /* Flow control (both RX and TX) is enabled by a software over-ride. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
        txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
        DEBUGOUT("Flow control param set incorrectly\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
        return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
    /* Since auto-negotiation is enabled, take the link out of reset (the link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
     * will be in reset, because we previously reset the chip). This will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
     * restart auto-negotiation.  If auto-neogtiation is successful then the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
     * link-up status bit will be set and the flow control enable bits (RFCE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
     * and TFCE) will be set according to their negotiated value.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
    DEBUGOUT("Auto-negotiation enabled\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
    E1000_WRITE_REG(hw, TXCW, txcw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
    hw->txcw = txcw;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
    msleep(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
    /* If we have a signal (the cable is plugged in) then poll for a "Link-Up"
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
     * indication in the Device Status Register.  Time-out if a link isn't
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
     * seen in 500 milliseconds seconds (Auto-negotiation should complete in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
     * less than 500 milliseconds even if the other end is doing it in SW).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
     * For internal serdes, we just assume a signal is present, then poll.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
    if (hw->media_type == e1000_media_type_internal_serdes ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
       (E1000_READ_REG(hw, CTRL) & E1000_CTRL_SWDPIN1) == signal) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
        DEBUGOUT("Looking for Link\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
        for (i = 0; i < (LINK_UP_TIMEOUT / 10); i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
            msleep(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
            status = E1000_READ_REG(hw, STATUS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
            if (status & E1000_STATUS_LU) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
        if (i == (LINK_UP_TIMEOUT / 10)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
            DEBUGOUT("Never got a valid link from auto-neg!!!\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
            hw->autoneg_failed = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
            /* AutoNeg failed to achieve a link, so we'll call
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
             * e1000_check_for_link. This routine will force the link up if
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
             * we detect a signal. This will allow us to communicate with
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
             * non-autonegotiating link partners.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
            ret_val = e1000_check_for_link(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
                DEBUGOUT("Error while checking for link\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
            hw->autoneg_failed = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
            hw->autoneg_failed = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
            DEBUGOUT("Valid Link Found\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
        DEBUGOUT("No Signal Detected\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
* Make sure we have a valid PHY and change PHY mode before link setup.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
e1000_copper_link_preconfig(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
    DEBUGFUNC("e1000_copper_link_preconfig");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
    /* With 82543, we need to force speed and duplex on the MAC equal to what
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
     * the PHY speed and duplex configuration is. In addition, we need to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
     * perform a hardware reset on the PHY to take it out of reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
    if (hw->mac_type > e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
        ctrl |= E1000_CTRL_SLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
        ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
        E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
        ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_SLU);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
        E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
        ret_val = e1000_phy_hw_reset(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
    /* Make sure we have a valid PHY */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
    ret_val = e1000_detect_gig_phy(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
        DEBUGOUT("Error, did not detect valid phy.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
    DEBUGOUT1("Phy ID = %x \n", hw->phy_id);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
    /* Set PHY to class A mode (if necessary) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
    ret_val = e1000_set_phy_mode(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
    if ((hw->mac_type == e1000_82545_rev_3) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
       (hw->mac_type == e1000_82546_rev_3)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
        phy_data |= 0x00000008;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
    if (hw->mac_type <= e1000_82543 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
        hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
        hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
        hw->phy_reset_disable = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
   return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
/********************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
* Copper link setup for e1000_phy_igp series.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
*********************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
e1000_copper_link_igp_setup(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
    uint32_t led_ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
    DEBUGFUNC("e1000_copper_link_igp_setup");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
    if (hw->phy_reset_disable)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
    ret_val = e1000_phy_reset(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
        DEBUGOUT("Error Resetting the PHY\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
    /* Wait 15ms for MAC to configure PHY from eeprom settings */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
    msleep(15);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
    if (hw->mac_type != e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
    /* Configure activity LED after PHY reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
    led_ctrl = E1000_READ_REG(hw, LEDCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
    led_ctrl &= IGP_ACTIVITY_LED_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
    led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
    E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
    /* The NVM settings will configure LPLU in D3 for IGP2 and IGP3 PHYs */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
    if (hw->phy_type == e1000_phy_igp) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
        /* disable lplu d3 during driver init */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
        ret_val = e1000_set_d3_lplu_state(hw, FALSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
            DEBUGOUT("Error Disabling LPLU D3\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
    /* disable lplu d0 during driver init */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
    ret_val = e1000_set_d0_lplu_state(hw, FALSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
        DEBUGOUT("Error Disabling LPLU D0\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
    /* Configure mdi-mdix settings */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
    ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
    if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
        hw->dsp_config_state = e1000_dsp_config_disabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
        /* Force MDI for earlier revs of the IGP PHY */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
        phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX | IGP01E1000_PSCR_FORCE_MDI_MDIX);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
        hw->mdix = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
        hw->dsp_config_state = e1000_dsp_config_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
        phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
        switch (hw->mdix) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
        case 1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
            phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
        case 2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
            phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
        case 0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
            phy_data |= IGP01E1000_PSCR_AUTO_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
    ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
    /* set auto-master slave resolution settings */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
    if (hw->autoneg) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
        e1000_ms_type phy_ms_setting = hw->master_slave;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
        if (hw->ffe_config_state == e1000_ffe_config_active)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
            hw->ffe_config_state = e1000_ffe_config_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
        if (hw->dsp_config_state == e1000_dsp_config_activated)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
            hw->dsp_config_state = e1000_dsp_config_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
        /* when autonegotiation advertisment is only 1000Mbps then we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
          * should disable SmartSpeed and enable Auto MasterSlave
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
          * resolution as hardware default. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
        if (hw->autoneg_advertised == ADVERTISE_1000_FULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
            /* Disable SmartSpeed */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
            phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
                                          phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
            /* Set auto Master/Slave resolution process */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
            ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
            phy_data &= ~CR_1000T_MS_ENABLE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
            ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
        ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
        /* load defaults for future use */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
        hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
                                        ((phy_data & CR_1000T_MS_VALUE) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
                                         e1000_ms_force_master :
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
                                         e1000_ms_force_slave) :
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
                                         e1000_ms_auto;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
        switch (phy_ms_setting) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
        case e1000_ms_force_master:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
            phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
        case e1000_ms_force_slave:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
            phy_data |= CR_1000T_MS_ENABLE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
            phy_data &= ~(CR_1000T_MS_VALUE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
        case e1000_ms_auto:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
            phy_data &= ~CR_1000T_MS_ENABLE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
            default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
        ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
/********************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
* Copper link setup for e1000_phy_gg82563 series.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
*********************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
e1000_copper_link_ggp_setup(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
    uint32_t reg_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
    DEBUGFUNC("e1000_copper_link_ggp_setup");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
    if (!hw->phy_reset_disable) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
        /* Enable CRS on TX for half-duplex operation. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
        ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
        phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
        /* Use 25MHz for both link down and 1000BASE-T for Tx clock */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
        phy_data |= GG82563_MSCR_TX_CLK_1000MBPS_25MHZ;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
        ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
                                      phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
        /* Options:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
         *   MDI/MDI-X = 0 (default)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
         *   0 - Auto for all speeds
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
         *   1 - MDI mode
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
         *   2 - MDI-X mode
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
         *   3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
        ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
        phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
        switch (hw->mdix) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
        case 1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
            phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
        case 2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
            phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
        case 0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
            phy_data |= GG82563_PSCR_CROSSOVER_MODE_AUTO;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
        /* Options:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
         *   disable_polarity_correction = 0 (default)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
         *       Automatic Correction for Reversed Cable Polarity
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
         *   0 - Disabled
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
         *   1 - Enabled
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
        phy_data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
        if (hw->disable_polarity_correction == 1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
            phy_data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
        ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
        /* SW Reset the PHY so all changes take effect */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
        ret_val = e1000_phy_reset(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
            DEBUGOUT("Error Resetting the PHY\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
    } /* phy_reset_disable */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
    if (hw->mac_type == e1000_80003es2lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
        /* Bypass RX and TX FIFO's */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
        ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
                                       E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
                                       E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
        ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
        phy_data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
        ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
        reg_data = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
        reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
        E1000_WRITE_REG(hw, CTRL_EXT, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
        ret_val = e1000_read_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
                                          &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
        /* Do not init these registers when the HW is in IAMT mode, since the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
         * firmware will have already initialized them.  We only initialize
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
         * them if the HW is not in IAMT mode.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
        if (e1000_check_mng_mode(hw) == FALSE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
            /* Enable Electrical Idle on the PHY */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
            phy_data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
            ret_val = e1000_write_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
                                          phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
            ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
            phy_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
            ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
                                          phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
        /* Workaround: Disable padding in Kumeran interface in the MAC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
         * and in the PHY to avoid CRC errors.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
        ret_val = e1000_read_phy_reg(hw, GG82563_PHY_INBAND_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
        phy_data |= GG82563_ICR_DIS_PADDING;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
        ret_val = e1000_write_phy_reg(hw, GG82563_PHY_INBAND_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
                                      phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
/********************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
* Copper link setup for e1000_phy_m88 series.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
*********************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
e1000_copper_link_mgp_setup(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
    DEBUGFUNC("e1000_copper_link_mgp_setup");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
    if (hw->phy_reset_disable)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
    /* Enable CRS on TX. This must be set for half-duplex operation. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
    phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
    /* Options:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
     *   MDI/MDI-X = 0 (default)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
     *   0 - Auto for all speeds
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
     *   1 - MDI mode
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
     *   2 - MDI-X mode
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
     *   3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
    phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
    switch (hw->mdix) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
    case 1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
        phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
    case 2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
        phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
    case 3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
        phy_data |= M88E1000_PSCR_AUTO_X_1000T;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
    case 0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
        phy_data |= M88E1000_PSCR_AUTO_X_MODE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
    /* Options:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
     *   disable_polarity_correction = 0 (default)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
     *       Automatic Correction for Reversed Cable Polarity
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
     *   0 - Disabled
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
     *   1 - Enabled
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
    phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
    if (hw->disable_polarity_correction == 1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
        phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
    if (hw->phy_revision < M88E1011_I_REV_4) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
        /* Force TX_CLK in the Extended PHY Specific Control Register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
         * to 25MHz clock.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
        ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
        phy_data |= M88E1000_EPSCR_TX_CLK_25;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
        if ((hw->phy_revision == E1000_REVISION_2) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
            (hw->phy_id == M88E1111_I_PHY_ID)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
            /* Vidalia Phy, set the downshift counter to 5x */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
            phy_data &= ~(M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
            phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
            ret_val = e1000_write_phy_reg(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
                                        M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
            /* Configure Master and Slave downshift values */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
            phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
                              M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
            phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
                             M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
            ret_val = e1000_write_phy_reg(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
                                        M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
               return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
    /* SW Reset the PHY so all changes take effect */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
    ret_val = e1000_phy_reset(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
        DEBUGOUT("Error Resetting the PHY\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
   return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
/********************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
* Setup auto-negotiation and flow control advertisements,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
* and then perform auto-negotiation.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
*********************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
e1000_copper_link_autoneg(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
    DEBUGFUNC("e1000_copper_link_autoneg");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
    /* Perform some bounds checking on the hw->autoneg_advertised
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
     * parameter.  If this variable is zero, then set it to the default.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
    hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
    /* If autoneg_advertised is zero, we assume it was not defaulted
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
     * by the calling code so we set to advertise full capability.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
    if (hw->autoneg_advertised == 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
        hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
    /* IFE phy only supports 10/100 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
    if (hw->phy_type == e1000_phy_ife)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
        hw->autoneg_advertised &= AUTONEG_ADVERTISE_10_100_ALL;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
    DEBUGOUT("Reconfiguring auto-neg advertisement params\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
    ret_val = e1000_phy_setup_autoneg(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
        DEBUGOUT("Error Setting up Auto-Negotiation\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
    DEBUGOUT("Restarting Auto-Neg\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
    /* Restart auto-negotiation by setting the Auto Neg Enable bit and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
     * the Auto Neg Restart bit in the PHY control register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
    ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
    phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
    ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
    /* Does the user want to wait for Auto-Neg to complete here, or
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
     * check at a later time (for example, callback routine).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
    if (hw->wait_autoneg_complete) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
        ret_val = e1000_wait_autoneg(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
            DEBUGOUT("Error while waiting for autoneg to complete\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
    hw->get_link_status = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
* Config the MAC and the PHY after link is up.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
*   1) Set up the MAC to the current PHY speed/duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
*      if we are on 82543.  If we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
*      are on newer silicon, we only need to configure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
*      collision distance in the Transmit Control Register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
*   2) Set up flow control on the MAC to that established with
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
*      the link partner.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
*   3) Config DSP to improve Gigabit link quality for some PHY revisions.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
e1000_copper_link_postconfig(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
    DEBUGFUNC("e1000_copper_link_postconfig");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
    if (hw->mac_type >= e1000_82544) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
        e1000_config_collision_dist(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
        ret_val = e1000_config_mac_to_phy(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
            DEBUGOUT("Error configuring MAC to PHY settings\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
    ret_val = e1000_config_fc_after_link_up(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
    if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
        DEBUGOUT("Error Configuring Flow Control\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
    /* Config DSP to improve Giga link quality */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
    if (hw->phy_type == e1000_phy_igp) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
        ret_val = e1000_config_dsp_after_link_change(hw, TRUE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
            DEBUGOUT("Error Configuring DSP after link up\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
* Detects which PHY is present and setup the speed and duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
e1000_setup_copper_link(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
    uint16_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
    uint16_t reg_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
    DEBUGFUNC("e1000_setup_copper_link");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
    case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
        /* Set the mac to wait the maximum time between each
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
         * iteration and increase the max iterations when
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
         * polling the phy; this fixes erroneous timeouts at 10Mbps. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
        ret_val = e1000_write_kmrn_reg(hw, GG82563_REG(0x34, 4), 0xFFFF);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
        ret_val = e1000_read_kmrn_reg(hw, GG82563_REG(0x34, 9), &reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
        reg_data |= 0x3F;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
        ret_val = e1000_write_kmrn_reg(hw, GG82563_REG(0x34, 9), reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
    /* Check if it is a valid PHY and set PHY mode if necessary. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
    ret_val = e1000_copper_link_preconfig(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
        /* Kumeran registers are written-only */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
        reg_data = E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
        reg_data |= E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
        ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_INB_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
                                       reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
    if (hw->phy_type == e1000_phy_igp ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
        hw->phy_type == e1000_phy_igp_3 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
        hw->phy_type == e1000_phy_igp_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
        ret_val = e1000_copper_link_igp_setup(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
    } else if (hw->phy_type == e1000_phy_m88) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
        ret_val = e1000_copper_link_mgp_setup(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
    } else if (hw->phy_type == e1000_phy_gg82563) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
        ret_val = e1000_copper_link_ggp_setup(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
    if (hw->autoneg) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
        /* Setup autoneg and flow control advertisement
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
          * and perform autonegotiation */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
        ret_val = e1000_copper_link_autoneg(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
        /* PHY will be set to 10H, 10F, 100H,or 100F
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
          * depending on value from forced_speed_duplex. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
        DEBUGOUT("Forcing speed and duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
        ret_val = e1000_phy_force_speed_duplex(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
            DEBUGOUT("Error Forcing Speed and Duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
    /* Check link status. Wait up to 100 microseconds for link to become
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
     * valid.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
    for (i = 0; i < 10; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
        if (phy_data & MII_SR_LINK_STATUS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
            /* Config the MAC and PHY after link is up */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
            ret_val = e1000_copper_link_postconfig(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
            DEBUGOUT("Valid link established!!!\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
            return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
        udelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
    DEBUGOUT("Unable to establish link!!!\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
* Configure the MAC-to-PHY interface for 10/100Mbps
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, uint16_t duplex)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
    int32_t ret_val = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
    uint32_t tipg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
    uint16_t reg_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
    DEBUGFUNC("e1000_configure_kmrn_for_10_100");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
    reg_data = E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
    ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
                                   reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
    /* Configure Transmit Inter-Packet Gap */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
    tipg = E1000_READ_REG(hw, TIPG);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
    tipg &= ~E1000_TIPG_IPGT_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
    tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
    E1000_WRITE_REG(hw, TIPG, tipg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
    ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
    if (duplex == HALF_DUPLEX)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
        reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
    else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
        reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
    ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
    int32_t ret_val = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
    uint16_t reg_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
    uint32_t tipg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
    DEBUGFUNC("e1000_configure_kmrn_for_1000");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
    reg_data = E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
    ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
                                   reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
    /* Configure Transmit Inter-Packet Gap */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
    tipg = E1000_READ_REG(hw, TIPG);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
    tipg &= ~E1000_TIPG_IPGT_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
    tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
    E1000_WRITE_REG(hw, TIPG, tipg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
    ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
    reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
    ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
* Configures PHY autoneg and flow control advertisement settings
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
e1000_phy_setup_autoneg(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
    uint16_t mii_autoneg_adv_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
    uint16_t mii_1000t_ctrl_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
    DEBUGFUNC("e1000_phy_setup_autoneg");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
    /* Read the MII Auto-Neg Advertisement Register (Address 4). */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
    ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
    if (hw->phy_type != e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
        /* Read the MII 1000Base-T Control Register (Address 9). */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
        ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
    } else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
        mii_1000t_ctrl_reg=0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
    /* Need to parse both autoneg_advertised and fc and set up
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
     * the appropriate PHY registers.  First we will parse for
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
     * autoneg_advertised software override.  Since we can advertise
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
     * a plethora of combinations, we need to check each bit
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
     * individually.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
    /* First we clear all the 10/100 mb speed bits in the Auto-Neg
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
     * Advertisement Register (Address 4) and the 1000 mb speed bits in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
     * the  1000Base-T Control Register (Address 9).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
    mii_autoneg_adv_reg &= ~REG4_SPEED_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
    mii_1000t_ctrl_reg &= ~REG9_SPEED_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
    DEBUGOUT1("autoneg_advertised %x\n", hw->autoneg_advertised);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
    /* Do we want to advertise 10 Mb Half Duplex? */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
    if (hw->autoneg_advertised & ADVERTISE_10_HALF) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
        DEBUGOUT("Advertise 10mb Half duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
        mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
    /* Do we want to advertise 10 Mb Full Duplex? */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
    if (hw->autoneg_advertised & ADVERTISE_10_FULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
        DEBUGOUT("Advertise 10mb Full duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
        mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
    /* Do we want to advertise 100 Mb Half Duplex? */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
    if (hw->autoneg_advertised & ADVERTISE_100_HALF) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
        DEBUGOUT("Advertise 100mb Half duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
        mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
    /* Do we want to advertise 100 Mb Full Duplex? */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
    if (hw->autoneg_advertised & ADVERTISE_100_FULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
        DEBUGOUT("Advertise 100mb Full duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
        mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
    /* We do not allow the Phy to advertise 1000 Mb Half Duplex */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
    if (hw->autoneg_advertised & ADVERTISE_1000_HALF) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
        DEBUGOUT("Advertise 1000mb Half duplex requested, request denied!\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
    /* Do we want to advertise 1000 Mb Full Duplex? */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
    if (hw->autoneg_advertised & ADVERTISE_1000_FULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
        DEBUGOUT("Advertise 1000mb Full duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
        mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
        if (hw->phy_type == e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
            DEBUGOUT("e1000_phy_ife is a 10/100 PHY. Gigabit speed is not supported.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
    /* Check for a software override of the flow control settings, and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
     * setup the PHY advertisement registers accordingly.  If
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
     * auto-negotiation is enabled, then software will have to set the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
     * "PAUSE" bits to the correct value in the Auto-Negotiation
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
     * Advertisement Register (PHY_AUTONEG_ADV) and re-start auto-negotiation.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
     *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
     * The possible values of the "fc" parameter are:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
     *      0:  Flow control is completely disabled
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
     *      1:  Rx flow control is enabled (we can receive pause frames
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
     *          but not send pause frames).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
     *      2:  Tx flow control is enabled (we can send pause frames
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
     *          but we do not support receiving pause frames).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
     *      3:  Both Rx and TX flow control (symmetric) are enabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
     *  other:  No software override.  The flow control configuration
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
     *          in the EEPROM is used.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
    switch (hw->fc) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
    case E1000_FC_NONE: /* 0 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
        /* Flow control (RX & TX) is completely disabled by a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
         * software over-ride.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
        mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
    case E1000_FC_RX_PAUSE: /* 1 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
        /* RX Flow control is enabled, and TX Flow control is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
         * disabled, by a software over-ride.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
        /* Since there really isn't a way to advertise that we are
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
         * capable of RX Pause ONLY, we will advertise that we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
         * support both symmetric and asymmetric RX PAUSE.  Later
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
         * (in e1000_config_fc_after_link_up) we will disable the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
         *hw's ability to send PAUSE frames.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
        mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
    case E1000_FC_TX_PAUSE: /* 2 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
        /* TX Flow control is enabled, and RX Flow control is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
         * disabled, by a software over-ride.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
        mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
        mii_autoneg_adv_reg &= ~NWAY_AR_PAUSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
    case E1000_FC_FULL: /* 3 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
        /* Flow control (both RX and TX) is enabled by a software
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
         * over-ride.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
        mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
        DEBUGOUT("Flow control param set incorrectly\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
        return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
    ret_val = e1000_write_phy_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
    DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
    if (hw->phy_type != e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
        ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
* Force PHY speed and duplex settings to hw->forced_speed_duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
e1000_phy_force_speed_duplex(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
    uint16_t mii_ctrl_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
    uint16_t mii_status_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
    uint16_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
    DEBUGFUNC("e1000_phy_force_speed_duplex");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
    /* Turn off Flow control if we are forcing speed and duplex. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
    hw->fc = E1000_FC_NONE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
    DEBUGOUT1("hw->fc = %d\n", hw->fc);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
    /* Read the Device Control Register. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
    /* Set the bits to Force Speed and Duplex in the Device Ctrl Reg. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
    ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
    ctrl &= ~(DEVICE_SPEED_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
    /* Clear the Auto Speed Detect Enable bit. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
    ctrl &= ~E1000_CTRL_ASDE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
    /* Read the MII Control Register. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
    ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
    /* We need to disable autoneg in order to force link and duplex. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
    mii_ctrl_reg &= ~MII_CR_AUTO_NEG_EN;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
    /* Are we forcing Full or Half Duplex? */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
    if (hw->forced_speed_duplex == e1000_100_full ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
        hw->forced_speed_duplex == e1000_10_full) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
        /* We want to force full duplex so we SET the full duplex bits in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
         * Device and MII Control Registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
        ctrl |= E1000_CTRL_FD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
        mii_ctrl_reg |= MII_CR_FULL_DUPLEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
        DEBUGOUT("Full Duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
        /* We want to force half duplex so we CLEAR the full duplex bits in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
         * the Device and MII Control Registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
        ctrl &= ~E1000_CTRL_FD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
        mii_ctrl_reg &= ~MII_CR_FULL_DUPLEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
        DEBUGOUT("Half Duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
    /* Are we forcing 100Mbps??? */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
    if (hw->forced_speed_duplex == e1000_100_full ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
       hw->forced_speed_duplex == e1000_100_half) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
        /* Set the 100Mb bit and turn off the 1000Mb and 10Mb bits. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
        ctrl |= E1000_CTRL_SPD_100;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
        mii_ctrl_reg |= MII_CR_SPEED_100;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
        mii_ctrl_reg &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
        DEBUGOUT("Forcing 100mb ");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
        /* Set the 10Mb bit and turn off the 1000Mb and 100Mb bits. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
        ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
        mii_ctrl_reg |= MII_CR_SPEED_10;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
        mii_ctrl_reg &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
        DEBUGOUT("Forcing 10mb ");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
    e1000_config_collision_dist(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
    /* Write the configured values back to the Device Control Reg. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
    if ((hw->phy_type == e1000_phy_m88) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
        (hw->phy_type == e1000_phy_gg82563)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
        /* Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
         * forced whenever speed are duplex are forced.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
        phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
        DEBUGOUT1("M88E1000 PSCR: %x \n", phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
        /* Need to reset the PHY or these changes will be ignored */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
        mii_ctrl_reg |= MII_CR_RESET;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
    /* Disable MDI-X support for 10/100 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
    } else if (hw->phy_type == e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
        ret_val = e1000_read_phy_reg(hw, IFE_PHY_MDIX_CONTROL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
        phy_data &= ~IFE_PMC_AUTO_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
        phy_data &= ~IFE_PMC_FORCE_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
        ret_val = e1000_write_phy_reg(hw, IFE_PHY_MDIX_CONTROL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
        /* Clear Auto-Crossover to force MDI manually.  IGP requires MDI
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
         * forced whenever speed or duplex are forced.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
        phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
        phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
    /* Write back the modified PHY MII control register. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
    ret_val = e1000_write_phy_reg(hw, PHY_CTRL, mii_ctrl_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
    udelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
    /* The wait_autoneg_complete flag may be a little misleading here.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
     * Since we are forcing speed and duplex, Auto-Neg is not enabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
     * But we do want to delay for a period while forcing only so we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
     * don't generate false No Link messages.  So we will wait here
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
     * only if the user has set wait_autoneg_complete to 1, which is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
     * the default.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
    if (hw->wait_autoneg_complete) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
        /* We will wait for autoneg to complete. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
        DEBUGOUT("Waiting for forced speed/duplex link.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
        mii_status_reg = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
        /* We will wait for autoneg to complete or 4.5 seconds to expire. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
        for (i = PHY_FORCE_TIME; i > 0; i--) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
            /* Read the MII Status Register and wait for Auto-Neg Complete bit
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
             * to be set.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
            if (mii_status_reg & MII_SR_LINK_STATUS) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
            msleep(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
        if ((i == 0) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
           ((hw->phy_type == e1000_phy_m88) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
            (hw->phy_type == e1000_phy_gg82563))) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
            /* We didn't get link.  Reset the DSP and wait again for link. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
            ret_val = e1000_phy_reset_dsp(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
                DEBUGOUT("Error Resetting PHY DSP\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
        /* This loop will early-out if the link condition has been met.  */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
        for (i = PHY_FORCE_TIME; i > 0; i--) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
            if (mii_status_reg & MII_SR_LINK_STATUS) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
            msleep(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
            /* Read the MII Status Register and wait for Auto-Neg Complete bit
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
             * to be set.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
    if (hw->phy_type == e1000_phy_m88) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
        /* Because we reset the PHY above, we need to re-force TX_CLK in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
         * Extended PHY Specific Control Register to 25MHz clock.  This value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
         * defaults back to a 2.5MHz clock when the PHY is reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
        ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
        phy_data |= M88E1000_EPSCR_TX_CLK_25;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
        ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
        /* In addition, because of the s/w reset above, we need to enable CRS on
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
         * TX.  This must be set for both full and half duplex operation.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
        phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
        if ((hw->mac_type == e1000_82544 || hw->mac_type == e1000_82543) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
            (!hw->autoneg) && (hw->forced_speed_duplex == e1000_10_full ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
             hw->forced_speed_duplex == e1000_10_half)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
            ret_val = e1000_polarity_reversal_workaround(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
    } else if (hw->phy_type == e1000_phy_gg82563) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
        /* The TX_CLK of the Extended PHY Specific Control Register defaults
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
         * to 2.5MHz on a reset.  We need to re-force it back to 25MHz, if
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
         * we're not in a forced 10/duplex configuration. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
        ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
        phy_data &= ~GG82563_MSCR_TX_CLK_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
        if ((hw->forced_speed_duplex == e1000_10_full) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
            (hw->forced_speed_duplex == e1000_10_half))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
            phy_data |= GG82563_MSCR_TX_CLK_10MBPS_2_5MHZ;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
            phy_data |= GG82563_MSCR_TX_CLK_100MBPS_25MHZ;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
        /* Also due to the reset, we need to enable CRS on Tx. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
        phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
        ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
* Sets the collision distance in the Transmit Control register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
* Link should have been established previously. Reads the speed and duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
* information from the Device Status register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
e1000_config_collision_dist(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
    uint32_t tctl, coll_dist;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
    DEBUGFUNC("e1000_config_collision_dist");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
    if (hw->mac_type < e1000_82543)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
        coll_dist = E1000_COLLISION_DISTANCE_82542;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
    else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
        coll_dist = E1000_COLLISION_DISTANCE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
    tctl = E1000_READ_REG(hw, TCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
    tctl &= ~E1000_TCTL_COLD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
    tctl |= coll_dist << E1000_COLD_SHIFT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
    E1000_WRITE_REG(hw, TCTL, tctl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
* Sets MAC speed and duplex settings to reflect the those in the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
* mii_reg - data to write to the MII control register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
* The contents of the PHY register containing the needed information need to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
* be passed in.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
e1000_config_mac_to_phy(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
    DEBUGFUNC("e1000_config_mac_to_phy");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
    /* 82544 or newer MAC, Auto Speed Detection takes care of
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
    * MAC speed/duplex configuration.*/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
    if (hw->mac_type >= e1000_82544)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
    /* Read the Device Control Register and set the bits to Force Speed
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
     * and Duplex.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
    ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
    ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
    /* Set up duplex in the Device Control and Transmit Control
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
     * registers depending on negotiated values.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
    if (phy_data & M88E1000_PSSR_DPLX)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
        ctrl |= E1000_CTRL_FD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
    else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
        ctrl &= ~E1000_CTRL_FD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
    e1000_config_collision_dist(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
    /* Set up speed in the Device Control register depending on
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
     * negotiated values.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
    if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
        ctrl |= E1000_CTRL_SPD_1000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
    else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
        ctrl |= E1000_CTRL_SPD_100;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
    /* Write the configured values back to the Device Control Reg. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
 * Forces the MAC's flow control settings.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
 * Sets the TFCE and RFCE bits in the device control register to reflect
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
 * the adapter settings. TFCE and RFCE need to be explicitly set by
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
 * software when a Copper PHY is used because autonegotiation is managed
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
 * by the PHY rather than the MAC. Software must also configure these
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
 * bits when link is forced on a fiber connection.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
e1000_force_mac_fc(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
    DEBUGFUNC("e1000_force_mac_fc");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
    /* Get the current configuration of the Device Control Register */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
    /* Because we didn't get link via the internal auto-negotiation
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
     * mechanism (we either forced link or we got link via PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
     * auto-neg), we have to manually enable/disable transmit an
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
     * receive flow control.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
     *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
     * The "Case" statement below enables/disable flow control
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
     * according to the "hw->fc" parameter.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
     *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
     * The possible values of the "fc" parameter are:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
     *      0:  Flow control is completely disabled
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
     *      1:  Rx flow control is enabled (we can receive pause
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
     *          frames but not send pause frames).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
     *      2:  Tx flow control is enabled (we can send pause frames
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
     *          frames but we do not receive pause frames).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
     *      3:  Both Rx and TX flow control (symmetric) is enabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
     *  other:  No other values should be possible at this point.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
    switch (hw->fc) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
    case E1000_FC_NONE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
        ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
    case E1000_FC_RX_PAUSE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
        ctrl &= (~E1000_CTRL_TFCE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
        ctrl |= E1000_CTRL_RFCE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
    case E1000_FC_TX_PAUSE:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
        ctrl &= (~E1000_CTRL_RFCE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
        ctrl |= E1000_CTRL_TFCE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
    case E1000_FC_FULL:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
        ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
        DEBUGOUT("Flow control param set incorrectly\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
        return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
    /* Disable TX Flow Control for 82542 (rev 2.0) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
    if (hw->mac_type == e1000_82542_rev2_0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
        ctrl &= (~E1000_CTRL_TFCE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
 * Configures flow control settings after link is established
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
 * Should be called immediately after a valid link has been established.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
 * Forces MAC flow control settings if link was forced. When in MII/GMII mode
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
 * and autonegotiation is enabled, the MAC flow control settings will be set
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
 * based on the flow control negotiated by the PHY. In TBI mode, the TFCE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
 * and RFCE bits will be automaticaly set to the negotiated flow control mode.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
e1000_config_fc_after_link_up(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
    uint16_t mii_status_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
    uint16_t mii_nway_adv_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
    uint16_t mii_nway_lp_ability_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
    uint16_t speed;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
    uint16_t duplex;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
    DEBUGFUNC("e1000_config_fc_after_link_up");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
    /* Check for the case where we have fiber media and auto-neg failed
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
     * so we had to force link.  In this case, we need to force the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
     * configuration of the MAC to match the "fc" parameter.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
    if (((hw->media_type == e1000_media_type_fiber) && (hw->autoneg_failed)) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
        ((hw->media_type == e1000_media_type_internal_serdes) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
         (hw->autoneg_failed)) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
        ((hw->media_type == e1000_media_type_copper) && (!hw->autoneg))) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
        ret_val = e1000_force_mac_fc(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
            DEBUGOUT("Error forcing flow control settings\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
    /* Check for the case where we have copper media and auto-neg is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
     * enabled.  In this case, we need to check and see if Auto-Neg
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
     * has completed, and if so, how the PHY and link partner has
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
     * flow control configured.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
    if ((hw->media_type == e1000_media_type_copper) && hw->autoneg) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
        /* Read the MII Status Register and check to see if AutoNeg
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
         * has completed.  We read this twice because this reg has
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
         * some "sticky" (latched) bits.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
        if (mii_status_reg & MII_SR_AUTONEG_COMPLETE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
            /* The AutoNeg process has completed, so we now need to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
             * read both the Auto Negotiation Advertisement Register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
             * (Address 4) and the Auto_Negotiation Base Page Ability
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
             * Register (Address 5) to determine how flow control was
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
             * negotiated.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
            ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
                                         &mii_nway_adv_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
            ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
                                         &mii_nway_lp_ability_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
            /* Two bits in the Auto Negotiation Advertisement Register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
             * (Address 4) and two bits in the Auto Negotiation Base
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
             * Page Ability Register (Address 5) determine flow control
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
             * for both the PHY and the link partner.  The following
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
             * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
             * 1999, describes these PAUSE resolution bits and how flow
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
             * control is determined based upon these settings.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
             * NOTE:  DC = Don't Care
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
             *   LOCAL DEVICE  |   LINK PARTNER
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
             * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
             *-------|---------|-------|---------|--------------------
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
             *   0   |    0    |  DC   |   DC    | E1000_FC_NONE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
             *   0   |    1    |   0   |   DC    | E1000_FC_NONE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
             *   0   |    1    |   1   |    0    | E1000_FC_NONE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
             *   0   |    1    |   1   |    1    | E1000_FC_TX_PAUSE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
             *   1   |    0    |   0   |   DC    | E1000_FC_NONE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
             *   1   |   DC    |   1   |   DC    | E1000_FC_FULL
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
             *   1   |    1    |   0   |    0    | E1000_FC_NONE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
             *   1   |    1    |   0   |    1    | E1000_FC_RX_PAUSE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
            /* Are both PAUSE bits set to 1?  If so, this implies
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
             * Symmetric Flow Control is enabled at both ends.  The
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
             * ASM_DIR bits are irrelevant per the spec.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
             * For Symmetric Flow Control:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
             *   LOCAL DEVICE  |   LINK PARTNER
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
             * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
             *-------|---------|-------|---------|--------------------
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
             *   1   |   DC    |   1   |   DC    | E1000_FC_FULL
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
            if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
                (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
                /* Now we need to check if the user selected RX ONLY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
                 * of pause frames.  In this case, we had to advertise
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
                 * FULL flow control because we could not advertise RX
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
                 * ONLY. Hence, we must now check to see if we need to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
                 * turn OFF  the TRANSMISSION of PAUSE frames.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
                 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
                if (hw->original_fc == E1000_FC_FULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
                    hw->fc = E1000_FC_FULL;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
                    DEBUGOUT("Flow Control = FULL.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
                } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
                    hw->fc = E1000_FC_RX_PAUSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
                    DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
            /* For receiving PAUSE frames ONLY.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
             *   LOCAL DEVICE  |   LINK PARTNER
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
             * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
             *-------|---------|-------|---------|--------------------
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
             *   0   |    1    |   1   |    1    | E1000_FC_TX_PAUSE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
            else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
                     (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
                     (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
                     (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
                hw->fc = E1000_FC_TX_PAUSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
                DEBUGOUT("Flow Control = TX PAUSE frames only.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
            /* For transmitting PAUSE frames ONLY.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
             *   LOCAL DEVICE  |   LINK PARTNER
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
             * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
             *-------|---------|-------|---------|--------------------
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
             *   1   |    1    |   0   |    1    | E1000_FC_RX_PAUSE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
             *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
            else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
                     (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
                     !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
                     (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
                hw->fc = E1000_FC_RX_PAUSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
                DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
            /* Per the IEEE spec, at this point flow control should be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
             * disabled.  However, we want to consider that we could
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
             * be connected to a legacy switch that doesn't advertise
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
             * desired flow control, but can be forced on the link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
             * partner.  So if we advertised no flow control, that is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
             * what we will resolve to.  If we advertised some kind of
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
             * receive capability (Rx Pause Only or Full Flow Control)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
             * and the link partner advertised none, we will configure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
             * ourselves to enable Rx Flow Control only.  We can do
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
             * this safely for two reasons:  If the link partner really
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
             * didn't want flow control enabled, and we enable Rx, no
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
             * harm done since we won't be receiving any PAUSE frames
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
             * anyway.  If the intent on the link partner was to have
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
             * flow control enabled, then by us enabling RX only, we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
             * can at least receive pause frames and process them.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
             * This is a good idea because in most cases, since we are
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
             * predominantly a server NIC, more times than not we will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
             * be asked to delay transmission of packets than asking
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
             * our link partner to pause transmission of frames.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
            else if ((hw->original_fc == E1000_FC_NONE ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
                      hw->original_fc == E1000_FC_TX_PAUSE) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
                      hw->fc_strict_ieee) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
                hw->fc = E1000_FC_NONE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
                DEBUGOUT("Flow Control = NONE.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
                hw->fc = E1000_FC_RX_PAUSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
                DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
            /* Now we need to do one last check...  If we auto-
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
             * negotiated to HALF DUPLEX, flow control should not be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
             * enabled per IEEE 802.3 spec.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
            ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
                DEBUGOUT("Error getting link speed and duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
            if (duplex == HALF_DUPLEX)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
                hw->fc = E1000_FC_NONE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
            /* Now we call a subroutine to actually force the MAC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
             * controller to use the correct flow control settings.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
            ret_val = e1000_force_mac_fc(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
                DEBUGOUT("Error forcing flow control settings\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
            DEBUGOUT("Copper PHY and Auto Neg has not completed.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
 * Checks to see if the link status of the hardware has changed.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
 * Called by any function that needs to check the link status of the adapter.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
e1000_check_for_link(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
    uint32_t rxcw = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
    uint32_t status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
    uint32_t rctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
    uint32_t icr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
    uint32_t signal = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
    DEBUGFUNC("e1000_check_for_link");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
    status = E1000_READ_REG(hw, STATUS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
    /* On adapters with a MAC newer than 82544, SW Defineable pin 1 will be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
     * set when the optics detect a signal. On older adapters, it will be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
     * cleared when there is a signal.  This applies to fiber media only.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
    if ((hw->media_type == e1000_media_type_fiber) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
        (hw->media_type == e1000_media_type_internal_serdes)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
        rxcw = E1000_READ_REG(hw, RXCW);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
        if (hw->media_type == e1000_media_type_fiber) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
            signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
            if (status & E1000_STATUS_LU)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
                hw->get_link_status = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
    /* If we have a copper PHY then we only want to go out to the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
     * registers to see if Auto-Neg has completed and/or if our link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
     * status has changed.  The get_link_status flag will be set if we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
     * receive a Link Status Change interrupt or we have Rx Sequence
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
     * Errors.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
    if ((hw->media_type == e1000_media_type_copper) && hw->get_link_status) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
        /* First we want to see if the MII Status Register reports
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
         * link.  If so, then we want to get the current speed/duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
         * of the PHY.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
         * Read the register twice since the link bit is sticky.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
        if (phy_data & MII_SR_LINK_STATUS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
            hw->get_link_status = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
            /* Check if there was DownShift, must be checked immediately after
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
             * link-up */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
            e1000_check_downshift(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
            /* If we are on 82544 or 82543 silicon and speed/duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
             * are forced to 10H or 10F, then we will implement the polarity
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
             * reversal workaround.  We disable interrupts first, and upon
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
             * returning, place the devices interrupt state to its previous
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
             * value except for the link status change interrupt which will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
             * happen due to the execution of this workaround.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
            if ((hw->mac_type == e1000_82544 || hw->mac_type == e1000_82543) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
                (!hw->autoneg) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
                (hw->forced_speed_duplex == e1000_10_full ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
                 hw->forced_speed_duplex == e1000_10_half)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
                E1000_WRITE_REG(hw, IMC, 0xffffffff);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
                ret_val = e1000_polarity_reversal_workaround(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
                icr = E1000_READ_REG(hw, ICR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
                E1000_WRITE_REG(hw, ICS, (icr & ~E1000_ICS_LSC));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
                E1000_WRITE_REG(hw, IMS, IMS_ENABLE_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
            /* No link detected */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
            e1000_config_dsp_after_link_change(hw, FALSE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
            return 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
        /* If we are forcing speed/duplex, then we simply return since
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
         * we have already determined whether we have link or not.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
        if (!hw->autoneg) return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
        /* optimize the dsp settings for the igp phy */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
        e1000_config_dsp_after_link_change(hw, TRUE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
        /* We have a M88E1000 PHY and Auto-Neg is enabled.  If we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
         * have Si on board that is 82544 or newer, Auto
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
         * Speed Detection takes care of MAC speed/duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
         * configuration.  So we only need to configure Collision
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
         * Distance in the MAC.  Otherwise, we need to force
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
         * speed/duplex on the MAC to the current PHY speed/duplex
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
         * settings.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
        if (hw->mac_type >= e1000_82544)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
            e1000_config_collision_dist(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
        else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
            ret_val = e1000_config_mac_to_phy(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
                DEBUGOUT("Error configuring MAC to PHY settings\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
        /* Configure Flow Control now that Auto-Neg has completed. First, we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
         * need to restore the desired flow control settings because we may
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
         * have had to re-autoneg with a different link partner.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
        ret_val = e1000_config_fc_after_link_up(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
            DEBUGOUT("Error configuring flow control\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
        /* At this point we know that we are on copper and we have
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
         * auto-negotiated link.  These are conditions for checking the link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
         * partner capability register.  We use the link speed to determine if
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
         * TBI compatibility needs to be turned on or off.  If the link is not
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
         * at gigabit speed, then TBI compatibility is not needed.  If we are
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
         * at gigabit speed, we turn on TBI compatibility.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
        if (hw->tbi_compatibility_en) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
            uint16_t speed, duplex;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
            ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
                DEBUGOUT("Error getting link speed and duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
            if (speed != SPEED_1000) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
                /* If link speed is not set to gigabit speed, we do not need
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
                 * to enable TBI compatibility.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
                 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
                if (hw->tbi_compatibility_on) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
                    /* If we previously were in the mode, turn it off. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
                    rctl = E1000_READ_REG(hw, RCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
                    rctl &= ~E1000_RCTL_SBP;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
                    E1000_WRITE_REG(hw, RCTL, rctl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
                    hw->tbi_compatibility_on = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
                /* If TBI compatibility is was previously off, turn it on. For
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
                 * compatibility with a TBI link partner, we will store bad
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
                 * packets. Some frames have an additional byte on the end and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
                 * will look like CRC errors to to the hardware.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
                 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
                if (!hw->tbi_compatibility_on) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
                    hw->tbi_compatibility_on = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
                    rctl = E1000_READ_REG(hw, RCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
                    rctl |= E1000_RCTL_SBP;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
                    E1000_WRITE_REG(hw, RCTL, rctl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
    /* If we don't have link (auto-negotiation failed or link partner cannot
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
     * auto-negotiate), the cable is plugged in (we have signal), and our
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
     * link partner is not trying to auto-negotiate with us (we are receiving
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
     * idles or data), we need to force link up. We also need to give
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
     * auto-negotiation time to complete, in case the cable was just plugged
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
     * in. The autoneg_failed flag does this.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
    else if ((((hw->media_type == e1000_media_type_fiber) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
              ((ctrl & E1000_CTRL_SWDPIN1) == signal)) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
              (hw->media_type == e1000_media_type_internal_serdes)) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
              (!(status & E1000_STATUS_LU)) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
              (!(rxcw & E1000_RXCW_C))) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
        if (hw->autoneg_failed == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
            hw->autoneg_failed = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
            return 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
        DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
        /* Disable auto-negotiation in the TXCW register */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
        E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
        /* Force link-up and also force full-duplex. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
        ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
        ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
        E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
        /* Configure Flow Control after forcing link up. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
        ret_val = e1000_config_fc_after_link_up(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
            DEBUGOUT("Error configuring flow control\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
    /* If we are forcing link and we are receiving /C/ ordered sets, re-enable
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
     * auto-negotiation in the TXCW register and disable forced link in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
     * Device Control register in an attempt to auto-negotiate with our link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
     * partner.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
    else if (((hw->media_type == e1000_media_type_fiber) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
              (hw->media_type == e1000_media_type_internal_serdes)) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
              (ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
        DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
        E1000_WRITE_REG(hw, TXCW, hw->txcw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
        E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
        hw->serdes_link_down = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
    /* If we force link for non-auto-negotiation switch, check link status
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
     * based on MAC synchronization for internal serdes media type.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
    else if ((hw->media_type == e1000_media_type_internal_serdes) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
             !(E1000_TXCW_ANE & E1000_READ_REG(hw, TXCW))) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
        /* SYNCH bit and IV bit are sticky. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
        udelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
        if (E1000_RXCW_SYNCH & E1000_READ_REG(hw, RXCW)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
            if (!(rxcw & E1000_RXCW_IV)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
                hw->serdes_link_down = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
                DEBUGOUT("SERDES: Link is up.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
            hw->serdes_link_down = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
            DEBUGOUT("SERDES: Link is down.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
    if ((hw->media_type == e1000_media_type_internal_serdes) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
        (E1000_TXCW_ANE & E1000_READ_REG(hw, TXCW))) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
        hw->serdes_link_down = !(E1000_STATUS_LU & E1000_READ_REG(hw, STATUS));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
 * Detects the current speed and duplex settings of the hardware.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
 * speed - Speed of the connection
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
 * duplex - Duplex setting of the connection
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
e1000_get_speed_and_duplex(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
                           uint16_t *speed,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
                           uint16_t *duplex)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
    uint32_t status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
    DEBUGFUNC("e1000_get_speed_and_duplex");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
    if (hw->mac_type >= e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
        status = E1000_READ_REG(hw, STATUS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
        if (status & E1000_STATUS_SPEED_1000) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
            *speed = SPEED_1000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
            DEBUGOUT("1000 Mbs, ");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
        } else if (status & E1000_STATUS_SPEED_100) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
            *speed = SPEED_100;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
            DEBUGOUT("100 Mbs, ");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
            *speed = SPEED_10;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
            DEBUGOUT("10 Mbs, ");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
        if (status & E1000_STATUS_FD) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
            *duplex = FULL_DUPLEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
            DEBUGOUT("Full Duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
            *duplex = HALF_DUPLEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
            DEBUGOUT(" Half Duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
        DEBUGOUT("1000 Mbs, Full Duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
        *speed = SPEED_1000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
        *duplex = FULL_DUPLEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
    /* IGP01 PHY may advertise full duplex operation after speed downgrade even
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
     * if it is operating at half duplex.  Here we set the duplex settings to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
     * match the duplex in the link partner's capabilities.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
    if (hw->phy_type == e1000_phy_igp && hw->speed_downgraded) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
        ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
        if (!(phy_data & NWAY_ER_LP_NWAY_CAPS))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
            *duplex = HALF_DUPLEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
        else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
            ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
            if ((*speed == SPEED_100 && !(phy_data & NWAY_LPAR_100TX_FD_CAPS)) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
               (*speed == SPEED_10 && !(phy_data & NWAY_LPAR_10T_FD_CAPS)))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
                *duplex = HALF_DUPLEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
    if ((hw->mac_type == e1000_80003es2lan) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
        (hw->media_type == e1000_media_type_copper)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
        if (*speed == SPEED_1000)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
            ret_val = e1000_configure_kmrn_for_1000(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
            ret_val = e1000_configure_kmrn_for_10_100(hw, *duplex);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
    if ((hw->phy_type == e1000_phy_igp_3) && (*speed == SPEED_1000)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
        ret_val = e1000_kumeran_lock_loss_workaround(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
* Blocks until autoneg completes or times out (~4.5 seconds)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
e1000_wait_autoneg(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
    uint16_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
    DEBUGFUNC("e1000_wait_autoneg");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
    DEBUGOUT("Waiting for Auto-Neg to complete.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
    /* We will wait for autoneg to complete or 4.5 seconds to expire. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
    for (i = PHY_AUTO_NEG_TIME; i > 0; i--) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
        /* Read the MII Status Register and wait for Auto-Neg
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
         * Complete bit to be set.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
        if (phy_data & MII_SR_AUTONEG_COMPLETE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
            return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
        msleep(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
* Raises the Management Data Clock
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
* ctrl - Device control register's current value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
e1000_raise_mdi_clk(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
                    uint32_t *ctrl)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
    /* Raise the clock input to the Management Data Clock (by setting the MDC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
     * bit), and then delay 10 microseconds.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
    E1000_WRITE_REG(hw, CTRL, (*ctrl | E1000_CTRL_MDC));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
    udelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
* Lowers the Management Data Clock
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
* ctrl - Device control register's current value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
e1000_lower_mdi_clk(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
                    uint32_t *ctrl)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
    /* Lower the clock input to the Management Data Clock (by clearing the MDC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
     * bit), and then delay 10 microseconds.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
    E1000_WRITE_REG(hw, CTRL, (*ctrl & ~E1000_CTRL_MDC));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
    udelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
* Shifts data bits out to the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
* data - Data to send out to the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
* count - Number of bits to shift out
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
* Bits are shifted out in MSB to LSB order.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
e1000_shift_out_mdi_bits(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
                         uint32_t data,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
                         uint16_t count)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
    uint32_t mask;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
    /* We need to shift "count" number of bits out to the PHY. So, the value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
     * in the "data" parameter will be shifted out to the PHY one bit at a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
     * time. In order to do this, "data" must be broken down into bits.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
    mask = 0x01;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
    mask <<= (count - 1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
    /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
    ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
    while (mask) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
        /* A "1" is shifted out to the PHY by setting the MDIO bit to "1" and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
         * then raising and lowering the Management Data Clock. A "0" is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
         * shifted out to the PHY by setting the MDIO bit to "0" and then
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
         * raising and lowering the clock.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
        if (data & mask)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
            ctrl |= E1000_CTRL_MDIO;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
            ctrl &= ~E1000_CTRL_MDIO;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
        E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
        udelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
        e1000_raise_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
        e1000_lower_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
        mask = mask >> 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
* Shifts data bits in from the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
* Bits are shifted in in MSB to LSB order.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
static uint16_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
e1000_shift_in_mdi_bits(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
    uint16_t data = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
    uint8_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
    /* In order to read a register from the PHY, we need to shift in a total
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
     * of 18 bits from the PHY. The first two bit (turnaround) times are used
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
     * to avoid contention on the MDIO pin when a read operation is performed.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
     * These two bits are ignored by us and thrown away. Bits are "shifted in"
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
     * by raising the input to the Management Data Clock (setting the MDC bit),
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
     * and then reading the value of the MDIO bit.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
    /* Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as input. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
    ctrl &= ~E1000_CTRL_MDIO_DIR;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
    ctrl &= ~E1000_CTRL_MDIO;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
    /* Raise and Lower the clock before reading in the data. This accounts for
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
     * the turnaround bits. The first clock occurred when we clocked out the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
     * last bit of the Register Address.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
    e1000_raise_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
    e1000_lower_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
    for (data = 0, i = 0; i < 16; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
        data = data << 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
        e1000_raise_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
        ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
        /* Check to see if we shifted in a "1". */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
        if (ctrl & E1000_CTRL_MDIO)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
            data |= 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
        e1000_lower_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
    e1000_raise_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
    e1000_lower_mdi_clk(hw, &ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
    return data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
    uint32_t swfw_sync = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
    uint32_t swmask = mask;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
    uint32_t fwmask = mask << 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
    int32_t timeout = 200;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
    DEBUGFUNC("e1000_swfw_sync_acquire");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
    if (hw->swfwhw_semaphore_present)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
        return e1000_get_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
    if (!hw->swfw_sync_present)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
        return e1000_get_hw_eeprom_semaphore(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
    while (timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
            if (e1000_get_hw_eeprom_semaphore(hw))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
                return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
            swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
            if (!(swfw_sync & (fwmask | swmask))) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
            /* firmware currently using resource (fwmask) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
            /* or other software thread currently using resource (swmask) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
            e1000_put_hw_eeprom_semaphore(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
            mdelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
            timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
    if (!timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
        DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
        return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
    swfw_sync |= swmask;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
    E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
    e1000_put_hw_eeprom_semaphore(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
    uint32_t swfw_sync;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
    uint32_t swmask = mask;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
    DEBUGFUNC("e1000_swfw_sync_release");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
    if (hw->swfwhw_semaphore_present) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
        e1000_release_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
    if (!hw->swfw_sync_present) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
        e1000_put_hw_eeprom_semaphore(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
    /* if (e1000_get_hw_eeprom_semaphore(hw))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
     *    return -E1000_ERR_SWFW_SYNC; */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
    while (e1000_get_hw_eeprom_semaphore(hw) != E1000_SUCCESS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
        /* empty */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
    swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
    swfw_sync &= ~swmask;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
    E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
    e1000_put_hw_eeprom_semaphore(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
* Reads the value from a PHY register, if the value is on a specific non zero
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
* page, sets the page first.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
* reg_addr - address of the PHY register to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
e1000_read_phy_reg(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
                   uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
                   uint16_t *phy_data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
    uint32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
    uint16_t swfw;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
    DEBUGFUNC("e1000_read_phy_reg");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
    if ((hw->mac_type == e1000_80003es2lan) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
        (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
        swfw = E1000_SWFW_PHY1_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
        swfw = E1000_SWFW_PHY0_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
    if (e1000_swfw_sync_acquire(hw, swfw))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
        return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
    if ((hw->phy_type == e1000_phy_igp ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
        hw->phy_type == e1000_phy_igp_3 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
        hw->phy_type == e1000_phy_igp_2) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
       (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
        ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
                                         (uint16_t)reg_addr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
            e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
    } else if (hw->phy_type == e1000_phy_gg82563) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
        if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
            (hw->mac_type == e1000_80003es2lan)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
            /* Select Configuration Page */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
            if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
                ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
                          (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
                /* Use Alternative Page Select register to access
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
                 * registers 30 and 31
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
                 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
                ret_val = e1000_write_phy_reg_ex(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
                                                 GG82563_PHY_PAGE_SELECT_ALT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
                          (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
                e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
    ret_val = e1000_read_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
                                    phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
    e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
e1000_read_phy_reg_ex(struct e1000_hw *hw, uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
                      uint16_t *phy_data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
    uint32_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
    uint32_t mdic = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
    const uint32_t phy_addr = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
    DEBUGFUNC("e1000_read_phy_reg_ex");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
    if (reg_addr > MAX_PHY_REG_ADDRESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
        DEBUGOUT1("PHY Address %d is out of range\n", reg_addr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
        return -E1000_ERR_PARAM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
    if (hw->mac_type > e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
        /* Set up Op-code, Phy Address, and register address in the MDI
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
         * Control register.  The MAC will take care of interfacing with the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
         * PHY to retrieve the desired data.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
        mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
                (phy_addr << E1000_MDIC_PHY_SHIFT) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
                (E1000_MDIC_OP_READ));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
        E1000_WRITE_REG(hw, MDIC, mdic);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
        /* Poll the ready bit to see if the MDI read completed */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
        for (i = 0; i < 64; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
            udelay(50);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
            mdic = E1000_READ_REG(hw, MDIC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
            if (mdic & E1000_MDIC_READY) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
        if (!(mdic & E1000_MDIC_READY)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
            DEBUGOUT("MDI Read did not complete\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
            return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
        if (mdic & E1000_MDIC_ERROR) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
            DEBUGOUT("MDI Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
            return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
        *phy_data = (uint16_t) mdic;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
        /* We must first send a preamble through the MDIO pin to signal the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
         * beginning of an MII instruction.  This is done by sending 32
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
         * consecutive "1" bits.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
        e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
        /* Now combine the next few fields that are required for a read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
         * operation.  We use this method instead of calling the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
         * e1000_shift_out_mdi_bits routine five different times. The format of
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
         * a MII read instruction consists of a shift out of 14 bits and is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
         * defined as follows:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
         *    <Preamble><SOF><Op Code><Phy Addr><Reg Addr>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
         * followed by a shift in of 18 bits.  This first two bits shifted in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
         * are TurnAround bits used to avoid contention on the MDIO pin when a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
         * READ operation is performed.  These two bits are thrown away
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
         * followed by a shift in of 16 bits which contains the desired data.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
        mdic = ((reg_addr) | (phy_addr << 5) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
                (PHY_OP_READ << 10) | (PHY_SOF << 12));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
        e1000_shift_out_mdi_bits(hw, mdic, 14);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
        /* Now that we've shifted out the read command to the MII, we need to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
         * "shift in" the 16-bit value (18 total bits) of the requested PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
         * register address.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
        *phy_data = e1000_shift_in_mdi_bits(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
* Writes a value to a PHY register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
* reg_addr - address of the PHY register to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
* data - data to write to the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
                    uint16_t phy_data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
    uint32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
    uint16_t swfw;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
    DEBUGFUNC("e1000_write_phy_reg");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
    if ((hw->mac_type == e1000_80003es2lan) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
        (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
        swfw = E1000_SWFW_PHY1_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
        swfw = E1000_SWFW_PHY0_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
    if (e1000_swfw_sync_acquire(hw, swfw))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
        return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
    if ((hw->phy_type == e1000_phy_igp ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
        hw->phy_type == e1000_phy_igp_3 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
        hw->phy_type == e1000_phy_igp_2) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
       (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
        ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
                                         (uint16_t)reg_addr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
            e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
    } else if (hw->phy_type == e1000_phy_gg82563) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
        if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
            (hw->mac_type == e1000_80003es2lan)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
            /* Select Configuration Page */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
            if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
                ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
                          (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
                /* Use Alternative Page Select register to access
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
                 * registers 30 and 31
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
                 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
                ret_val = e1000_write_phy_reg_ex(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
                                                 GG82563_PHY_PAGE_SELECT_ALT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
                          (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
            if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
                e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
    ret_val = e1000_write_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
                                     phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
    e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
e1000_write_phy_reg_ex(struct e1000_hw *hw, uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
                       uint16_t phy_data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
    uint32_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
    uint32_t mdic = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
    const uint32_t phy_addr = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
    DEBUGFUNC("e1000_write_phy_reg_ex");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
    if (reg_addr > MAX_PHY_REG_ADDRESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
        DEBUGOUT1("PHY Address %d is out of range\n", reg_addr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
        return -E1000_ERR_PARAM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
    if (hw->mac_type > e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
        /* Set up Op-code, Phy Address, register address, and data intended
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
         * for the PHY register in the MDI Control register.  The MAC will take
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
         * care of interfacing with the PHY to send the desired data.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
        mdic = (((uint32_t) phy_data) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
                (reg_addr << E1000_MDIC_REG_SHIFT) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
                (phy_addr << E1000_MDIC_PHY_SHIFT) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
                (E1000_MDIC_OP_WRITE));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
        E1000_WRITE_REG(hw, MDIC, mdic);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
        /* Poll the ready bit to see if the MDI read completed */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
        for (i = 0; i < 641; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
            udelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
            mdic = E1000_READ_REG(hw, MDIC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
            if (mdic & E1000_MDIC_READY) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
        if (!(mdic & E1000_MDIC_READY)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
            DEBUGOUT("MDI Write did not complete\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
            return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
        /* We'll need to use the SW defined pins to shift the write command
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
         * out to the PHY. We first send a preamble to the PHY to signal the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
         * beginning of the MII instruction.  This is done by sending 32
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
         * consecutive "1" bits.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
        e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
        /* Now combine the remaining required fields that will indicate a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
         * write operation. We use this method instead of calling the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
         * e1000_shift_out_mdi_bits routine for each field in the command. The
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
         * format of a MII write instruction is as follows:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
         * <Preamble><SOF><Op Code><Phy Addr><Reg Addr><Turnaround><Data>.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
        mdic = ((PHY_TURNAROUND) | (reg_addr << 2) | (phy_addr << 7) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
                (PHY_OP_WRITE << 12) | (PHY_SOF << 14));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
        mdic <<= 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
        mdic |= (uint32_t) phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
        e1000_shift_out_mdi_bits(hw, mdic, 32);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
e1000_read_kmrn_reg(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
                    uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
                    uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
    uint32_t reg_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
    uint16_t swfw;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
    DEBUGFUNC("e1000_read_kmrn_reg");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
    if ((hw->mac_type == e1000_80003es2lan) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
        (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
        swfw = E1000_SWFW_PHY1_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
        swfw = E1000_SWFW_PHY0_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
    if (e1000_swfw_sync_acquire(hw, swfw))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
        return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
    /* Write register address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
    reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
              E1000_KUMCTRLSTA_OFFSET) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
              E1000_KUMCTRLSTA_REN;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
    E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
    udelay(2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
    /* Read the data returned */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
    reg_val = E1000_READ_REG(hw, KUMCTRLSTA);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
    *data = (uint16_t)reg_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
    e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
e1000_write_kmrn_reg(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
                     uint32_t reg_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
                     uint16_t data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
    uint32_t reg_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
    uint16_t swfw;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
    DEBUGFUNC("e1000_write_kmrn_reg");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
    if ((hw->mac_type == e1000_80003es2lan) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
        (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
        swfw = E1000_SWFW_PHY1_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
        swfw = E1000_SWFW_PHY0_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
    if (e1000_swfw_sync_acquire(hw, swfw))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
        return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
    reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
              E1000_KUMCTRLSTA_OFFSET) | data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
    E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
    udelay(2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
    e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
* Returns the PHY to the power-on reset state
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
e1000_phy_hw_reset(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
    uint32_t ctrl, ctrl_ext;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
    uint32_t led_ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
    uint16_t swfw;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
    DEBUGFUNC("e1000_phy_hw_reset");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
    /* In the case of the phy reset being blocked, it's not an error, we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
     * simply return success without performing the reset. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
    ret_val = e1000_check_phy_reset_block(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
    DEBUGOUT("Resetting Phy...\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
    if (hw->mac_type > e1000_82543) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
        if ((hw->mac_type == e1000_80003es2lan) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
            (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
            swfw = E1000_SWFW_PHY1_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
            swfw = E1000_SWFW_PHY0_SM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
        if (e1000_swfw_sync_acquire(hw, swfw)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
            DEBUGOUT("Unable to acquire swfw sync\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
            return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
        /* Read the device control register and assert the E1000_CTRL_PHY_RST
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
         * bit. Then, take it out of reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
         * For pre-e1000_82571 hardware, we delay for 10ms between the assert
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
         * and deassert.  For e1000_82571 hardware and later, we instead delay
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
         * for 50us between and 10ms after the deassertion.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
        ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
        E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
        if (hw->mac_type < e1000_82571)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
            msleep(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
            udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
        E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
        if (hw->mac_type >= e1000_82571)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
            mdelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
        e1000_swfw_sync_release(hw, swfw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
        /* Read the Extended Device Control Register, assert the PHY_RESET_DIR
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
         * bit to put the PHY into reset. Then, take it out of reset.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
        ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
        ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
        ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
        E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
        msleep(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
        ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
        E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
    udelay(150);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
    if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
        /* Configure activity LED after PHY reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
        led_ctrl = E1000_READ_REG(hw, LEDCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
        led_ctrl &= IGP_ACTIVITY_LED_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
        led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
        E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
    /* Wait for FW to finish PHY configuration. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
    ret_val = e1000_get_phy_cfg_done(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
    if (ret_val != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
    e1000_release_software_semaphore(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
    if ((hw->mac_type == e1000_ich8lan) && (hw->phy_type == e1000_phy_igp_3))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
        ret_val = e1000_init_lcd_from_nvm(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
* Resets the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
* Sets bit 15 of the MII Control register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
e1000_phy_reset(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
    DEBUGFUNC("e1000_phy_reset");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
    /* In the case of the phy reset being blocked, it's not an error, we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
     * simply return success without performing the reset. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
    ret_val = e1000_check_phy_reset_block(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
    switch (hw->phy_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
    case e1000_phy_igp:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
    case e1000_phy_igp_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
    case e1000_phy_igp_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
    case e1000_phy_ife:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
        ret_val = e1000_phy_hw_reset(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
        ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
        phy_data |= MII_CR_RESET;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
        ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
        udelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
    if (hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
        e1000_phy_init_script(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
* Work-around for 82566 power-down: on D3 entry-
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
* 1) disable gigabit link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
* 2) write VR power-down enable
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
* 3) read it back
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
* if successful continue, else issue LCD reset and repeat
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
* hw - struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
e1000_phy_powerdown_workaround(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
    int32_t reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
    int32_t retry = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
    DEBUGFUNC("e1000_phy_powerdown_workaround");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
    if (hw->phy_type != e1000_phy_igp_3)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
        /* Disable link */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
        reg = E1000_READ_REG(hw, PHY_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
        E1000_WRITE_REG(hw, PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
                        E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
        /* Write VR power-down enable - bits 9:8 should be 10b */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
        e1000_read_phy_reg(hw, IGP3_VR_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
        phy_data |= (1 << 9);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
        phy_data &= ~(1 << 8);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
        e1000_write_phy_reg(hw, IGP3_VR_CTRL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
        /* Read it back and test */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
        e1000_read_phy_reg(hw, IGP3_VR_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
        if (((phy_data & IGP3_VR_CTRL_MODE_MASK) == IGP3_VR_CTRL_MODE_SHUT) || retry)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
        /* Issue PHY reset and repeat at most one more time */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
        reg = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
        E1000_WRITE_REG(hw, CTRL, reg | E1000_CTRL_PHY_RST);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
        retry++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
    } while (retry);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
    return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
* Work-around for 82566 Kumeran PCS lock loss:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
* On link status change (i.e. PCI reset, speed change) and link is up and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
* speed is gigabit-
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
* 0) if workaround is optionally disabled do nothing
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
* 1) wait 1ms for Kumeran link to come up
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
* 2) check Kumeran Diagnostic register PCS lock loss bit
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
* 3) if not set the link is locked (all is good), otherwise...
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
* 4) reset the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
* 5) repeat up to 10 times
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
* Note: this is only called for IGP3 copper when speed is 1gb.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
* hw - struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
    int32_t reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
    int32_t cnt;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
    if (hw->kmrn_lock_loss_workaround_disabled)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
    /* Make sure link is up before proceeding.  If not just return.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
     * Attempting this while link is negotiating fouled up link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
     * stability */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
    ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
    ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
    if (phy_data & MII_SR_LINK_STATUS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
        for (cnt = 0; cnt < 10; cnt++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
            /* read once to clear */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
            ret_val = e1000_read_phy_reg(hw, IGP3_KMRN_DIAG, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
            /* and again to get new status */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
            ret_val = e1000_read_phy_reg(hw, IGP3_KMRN_DIAG, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
            /* check for PCS lock */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
            if (!(phy_data & IGP3_KMRN_DIAG_PCS_LOCK_LOSS))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
                return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
            /* Issue PHY reset */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
            e1000_phy_hw_reset(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
            mdelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
        /* Disable GigE link negotiation */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
        reg = E1000_READ_REG(hw, PHY_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
        E1000_WRITE_REG(hw, PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
                        E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
        /* unable to acquire PCS lock */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
        return E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
* Probes the expected PHY address for known PHY IDs
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
e1000_detect_gig_phy(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
    int32_t phy_init_status, ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
    uint16_t phy_id_high, phy_id_low;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
    boolean_t match = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
    DEBUGFUNC("e1000_detect_gig_phy");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
    if (hw->phy_id != 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
    /* The 82571 firmware may still be configuring the PHY.  In this
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
     * case, we cannot access the PHY until the configuration is done.  So
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
     * we explicitly set the PHY values. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
    if (hw->mac_type == e1000_82571 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
        hw->mac_type == e1000_82572) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
        hw->phy_id = IGP01E1000_I_PHY_ID;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
        hw->phy_type = e1000_phy_igp_2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
    /* ESB-2 PHY reads require e1000_phy_gg82563 to be set because of a work-
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
     * around that forces PHY page 0 to be set or the reads fail.  The rest of
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
     * the code in this routine uses e1000_read_phy_reg to read the PHY ID.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
     * So for ESB-2 we need to have this set so our reads won't fail.  If the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
     * attached PHY is not a e1000_phy_gg82563, the routines below will figure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
     * this out as well. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
    if (hw->mac_type == e1000_80003es2lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
        hw->phy_type = e1000_phy_gg82563;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
    /* Read the PHY ID Registers to identify which PHY is onboard. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
    ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
    hw->phy_id = (uint32_t) (phy_id_high << 16);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
    udelay(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
    ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
    hw->phy_id |= (uint32_t) (phy_id_low & PHY_REVISION_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
    hw->phy_revision = (uint32_t) phy_id_low & ~PHY_REVISION_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
    case e1000_82543:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
        if (hw->phy_id == M88E1000_E_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
    case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
        if (hw->phy_id == M88E1000_I_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
    case e1000_82540:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
    case e1000_82545:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
    case e1000_82545_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
    case e1000_82546:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
    case e1000_82546_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
        if (hw->phy_id == M88E1011_I_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
    case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
    case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
    case e1000_82547:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
    case e1000_82547_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
        if (hw->phy_id == IGP01E1000_I_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
    case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
        if (hw->phy_id == M88E1111_I_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
        if (hw->phy_id == GG82563_E_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
    case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
        if (hw->phy_id == IGP03E1000_E_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
        if (hw->phy_id == IFE_E_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
        if (hw->phy_id == IFE_PLUS_E_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
        if (hw->phy_id == IFE_C_E_PHY_ID) match = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
        DEBUGOUT1("Invalid MAC type %d\n", hw->mac_type);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
        return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
    phy_init_status = e1000_set_phy_type(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
    if ((match) && (phy_init_status == E1000_SUCCESS)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
        DEBUGOUT1("PHY ID 0x%X detected\n", hw->phy_id);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
    DEBUGOUT1("Invalid PHY ID 0x%X\n", hw->phy_id);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
    return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
* Resets the PHY's DSP
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
e1000_phy_reset_dsp(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
    DEBUGFUNC("e1000_phy_reset_dsp");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
        if (hw->phy_type != e1000_phy_gg82563) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
            ret_val = e1000_write_phy_reg(hw, 29, 0x001d);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
            if (ret_val) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
        ret_val = e1000_write_phy_reg(hw, 30, 0x00c1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
        if (ret_val) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
        ret_val = e1000_write_phy_reg(hw, 30, 0x0000);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
        if (ret_val) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
        ret_val = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
    } while (0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
* Get PHY information from various PHY registers for igp PHY only.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
* phy_info - PHY information structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
e1000_phy_igp_get_info(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
                       struct e1000_phy_info *phy_info)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
    uint16_t phy_data, min_length, max_length, average;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
    e1000_rev_polarity polarity;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
    DEBUGFUNC("e1000_phy_igp_get_info");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
    /* The downshift status is checked only once, after link is established,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
     * and it stored in the hw->speed_downgraded parameter. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
    phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
    /* IGP01E1000 does not need to support it. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
    phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
    /* IGP01E1000 always correct polarity reversal */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
    phy_info->polarity_correction = e1000_polarity_reversal_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
    /* Check polarity status */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
    ret_val = e1000_check_polarity(hw, &polarity);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
    phy_info->cable_polarity = polarity;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
    ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
    phy_info->mdix_mode = (e1000_auto_x_mode)((phy_data & IGP01E1000_PSSR_MDIX) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
                          IGP01E1000_PSSR_MDIX_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
    if ((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
       IGP01E1000_PSSR_SPEED_1000MBPS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
        /* Local/Remote Receiver Information are only valid at 1000 Mbps */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
        ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
        phy_info->local_rx = ((phy_data & SR_1000T_LOCAL_RX_STATUS) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
                             SR_1000T_LOCAL_RX_STATUS_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
                             e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
        phy_info->remote_rx = ((phy_data & SR_1000T_REMOTE_RX_STATUS) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
                              SR_1000T_REMOTE_RX_STATUS_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
                              e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
        /* Get cable length */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
        ret_val = e1000_get_cable_length(hw, &min_length, &max_length);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
        /* Translate to old method */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
        average = (max_length + min_length) / 2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
        if (average <= e1000_igp_cable_length_50)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
            phy_info->cable_length = e1000_cable_length_50;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
        else if (average <= e1000_igp_cable_length_80)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
            phy_info->cable_length = e1000_cable_length_50_80;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
        else if (average <= e1000_igp_cable_length_110)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
            phy_info->cable_length = e1000_cable_length_80_110;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
        else if (average <= e1000_igp_cable_length_140)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
            phy_info->cable_length = e1000_cable_length_110_140;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
            phy_info->cable_length = e1000_cable_length_140;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
* Get PHY information from various PHY registers for ife PHY only.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
* phy_info - PHY information structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
e1000_phy_ife_get_info(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
                       struct e1000_phy_info *phy_info)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
    e1000_rev_polarity polarity;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
    DEBUGFUNC("e1000_phy_ife_get_info");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
    phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
    phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
    ret_val = e1000_read_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
    phy_info->polarity_correction =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
                        ((phy_data & IFE_PSC_AUTO_POLARITY_DISABLE) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
                        IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
                        e1000_polarity_reversal_disabled : e1000_polarity_reversal_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
    if (phy_info->polarity_correction == e1000_polarity_reversal_enabled) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
        ret_val = e1000_check_polarity(hw, &polarity);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
        /* Polarity is forced. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
        polarity = ((phy_data & IFE_PSC_FORCE_POLARITY) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
                     IFE_PSC_FORCE_POLARITY_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
                     e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
    phy_info->cable_polarity = polarity;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
    ret_val = e1000_read_phy_reg(hw, IFE_PHY_MDIX_CONTROL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
    phy_info->mdix_mode = (e1000_auto_x_mode)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
                     ((phy_data & (IFE_PMC_AUTO_MDIX | IFE_PMC_FORCE_MDIX)) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
                     IFE_PMC_MDIX_MODE_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
* Get PHY information from various PHY registers fot m88 PHY only.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
* phy_info - PHY information structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
e1000_phy_m88_get_info(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
                       struct e1000_phy_info *phy_info)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
    e1000_rev_polarity polarity;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
    DEBUGFUNC("e1000_phy_m88_get_info");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
    /* The downshift status is checked only once, after link is established,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
     * and it stored in the hw->speed_downgraded parameter. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
    phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
    phy_info->extended_10bt_distance =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
        ((phy_data & M88E1000_PSCR_10BT_EXT_DIST_ENABLE) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
        M88E1000_PSCR_10BT_EXT_DIST_ENABLE_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
        e1000_10bt_ext_dist_enable_lower : e1000_10bt_ext_dist_enable_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
    phy_info->polarity_correction =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
        ((phy_data & M88E1000_PSCR_POLARITY_REVERSAL) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
        M88E1000_PSCR_POLARITY_REVERSAL_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
        e1000_polarity_reversal_disabled : e1000_polarity_reversal_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
    /* Check polarity status */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
    ret_val = e1000_check_polarity(hw, &polarity);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
    phy_info->cable_polarity = polarity;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
    phy_info->mdix_mode = (e1000_auto_x_mode)((phy_data & M88E1000_PSSR_MDIX) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
                          M88E1000_PSSR_MDIX_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
    if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
        /* Cable Length Estimation and Local/Remote Receiver Information
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
         * are only valid at 1000 Mbps.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
        if (hw->phy_type != e1000_phy_gg82563) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
            phy_info->cable_length = (e1000_cable_length)((phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
                                      M88E1000_PSSR_CABLE_LENGTH_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
            ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
            phy_info->cable_length = (e1000_cable_length)(phy_data & GG82563_DSPD_CABLE_LENGTH);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
        ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
        phy_info->local_rx = ((phy_data & SR_1000T_LOCAL_RX_STATUS) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
                             SR_1000T_LOCAL_RX_STATUS_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
                             e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
        phy_info->remote_rx = ((phy_data & SR_1000T_REMOTE_RX_STATUS) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
                              SR_1000T_REMOTE_RX_STATUS_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
                              e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
* Get PHY information from various PHY registers
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
* phy_info - PHY information structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
e1000_phy_get_info(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
                   struct e1000_phy_info *phy_info)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
    DEBUGFUNC("e1000_phy_get_info");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
    phy_info->cable_length = e1000_cable_length_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
    phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
    phy_info->cable_polarity = e1000_rev_polarity_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
    phy_info->downshift = e1000_downshift_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
    phy_info->polarity_correction = e1000_polarity_reversal_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
    phy_info->mdix_mode = e1000_auto_x_mode_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
    phy_info->local_rx = e1000_1000t_rx_status_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
    phy_info->remote_rx = e1000_1000t_rx_status_undefined;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
    if (hw->media_type != e1000_media_type_copper) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
        DEBUGOUT("PHY info is only valid for copper media\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
        return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
    ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
    ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
    if ((phy_data & MII_SR_LINK_STATUS) != MII_SR_LINK_STATUS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
        DEBUGOUT("PHY info is only valid if link is up\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
        return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
    if (hw->phy_type == e1000_phy_igp ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
        hw->phy_type == e1000_phy_igp_3 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
        hw->phy_type == e1000_phy_igp_2)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
        return e1000_phy_igp_get_info(hw, phy_info);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
    else if (hw->phy_type == e1000_phy_ife)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
        return e1000_phy_ife_get_info(hw, phy_info);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
    else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
        return e1000_phy_m88_get_info(hw, phy_info);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
e1000_validate_mdi_setting(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
    DEBUGFUNC("e1000_validate_mdi_settings");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
    if (!hw->autoneg && (hw->mdix == 0 || hw->mdix == 3)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
        DEBUGOUT("Invalid MDI setting detected\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
        hw->mdix = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
        return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
 * Sets up eeprom variables in the hw struct.  Must be called after mac_type
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
 * is configured.  Additionally, if this is ICH8, the flash controller GbE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
 * registers must be mapped, or this will crash.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
e1000_init_eeprom_params(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
    uint32_t eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
    int32_t ret_val = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
    uint16_t eeprom_size;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
    DEBUGFUNC("e1000_init_eeprom_params");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
    case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
    case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
    case e1000_82543:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
    case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
        eeprom->type = e1000_eeprom_microwire;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
        eeprom->word_size = 64;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
        eeprom->opcode_bits = 3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
        eeprom->address_bits = 6;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
        eeprom->delay_usec = 50;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
        eeprom->use_eerd = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
        eeprom->use_eewr = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
    case e1000_82540:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
    case e1000_82545:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
    case e1000_82545_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
    case e1000_82546:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
    case e1000_82546_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
        eeprom->type = e1000_eeprom_microwire;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
        eeprom->opcode_bits = 3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
        eeprom->delay_usec = 50;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
        if (eecd & E1000_EECD_SIZE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
            eeprom->word_size = 256;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
            eeprom->address_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
            eeprom->word_size = 64;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
            eeprom->address_bits = 6;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
        eeprom->use_eerd = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
        eeprom->use_eewr = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
    case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
    case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
    case e1000_82547:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
    case e1000_82547_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
        if (eecd & E1000_EECD_TYPE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
            eeprom->type = e1000_eeprom_spi;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
            eeprom->opcode_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
            eeprom->delay_usec = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
            if (eecd & E1000_EECD_ADDR_BITS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
                eeprom->page_size = 32;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
                eeprom->address_bits = 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
                eeprom->page_size = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
                eeprom->address_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
            eeprom->type = e1000_eeprom_microwire;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
            eeprom->opcode_bits = 3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
            eeprom->delay_usec = 50;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
            if (eecd & E1000_EECD_ADDR_BITS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
                eeprom->word_size = 256;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
                eeprom->address_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
                eeprom->word_size = 64;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
                eeprom->address_bits = 6;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
        eeprom->use_eerd = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
        eeprom->use_eewr = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
    case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
        eeprom->type = e1000_eeprom_spi;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
        eeprom->opcode_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
        eeprom->delay_usec = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
        if (eecd & E1000_EECD_ADDR_BITS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
            eeprom->page_size = 32;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
            eeprom->address_bits = 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
            eeprom->page_size = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
            eeprom->address_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
        eeprom->use_eerd = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
        eeprom->use_eewr = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
    case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
        eeprom->type = e1000_eeprom_spi;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
        eeprom->opcode_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
        eeprom->delay_usec = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
        if (eecd & E1000_EECD_ADDR_BITS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
            eeprom->page_size = 32;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
            eeprom->address_bits = 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
            eeprom->page_size = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
            eeprom->address_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
        eeprom->use_eerd = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
        eeprom->use_eewr = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
        if (e1000_is_onboard_nvm_eeprom(hw) == FALSE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
            eeprom->type = e1000_eeprom_flash;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
            eeprom->word_size = 2048;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
            /* Ensure that the Autonomous FLASH update bit is cleared due to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
             * Flash update issue on parts which use a FLASH for NVM. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
            eecd &= ~E1000_EECD_AUPDEN;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
            E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
        eeprom->type = e1000_eeprom_spi;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
        eeprom->opcode_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
        eeprom->delay_usec = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
        if (eecd & E1000_EECD_ADDR_BITS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
            eeprom->page_size = 32;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
            eeprom->address_bits = 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
            eeprom->page_size = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
            eeprom->address_bits = 8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
        eeprom->use_eerd = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
        eeprom->use_eewr = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
    case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
        {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
        int32_t  i = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
        uint32_t flash_size = E1000_READ_ICH_FLASH_REG(hw, ICH_FLASH_GFPREG);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
        eeprom->type = e1000_eeprom_ich8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
        eeprom->use_eerd = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
        eeprom->use_eewr = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
        eeprom->word_size = E1000_SHADOW_RAM_WORDS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
        /* Zero the shadow RAM structure. But don't load it from NVM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
         * so as to save time for driver init */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
        if (hw->eeprom_shadow_ram != NULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
            for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
                hw->eeprom_shadow_ram[i].modified = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
                hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
        hw->flash_base_addr = (flash_size & ICH_GFPREG_BASE_MASK) *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
                              ICH_FLASH_SECTOR_SIZE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
        hw->flash_bank_size = ((flash_size >> 16) & ICH_GFPREG_BASE_MASK) + 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
        hw->flash_bank_size -= (flash_size & ICH_GFPREG_BASE_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
        hw->flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
        hw->flash_bank_size /= 2 * sizeof(uint16_t);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
    if (eeprom->type == e1000_eeprom_spi) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
        /* eeprom_size will be an enum [0..8] that maps to eeprom sizes 128B to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
         * 32KB (incremented by powers of 2).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
        if (hw->mac_type <= e1000_82547_rev_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
            /* Set to default value for initial eeprom read. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
            eeprom->word_size = 64;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
            ret_val = e1000_read_eeprom(hw, EEPROM_CFG, 1, &eeprom_size);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
            eeprom_size = (eeprom_size & EEPROM_SIZE_MASK) >> EEPROM_SIZE_SHIFT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
            /* 256B eeprom size was not supported in earlier hardware, so we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
             * bump eeprom_size up one to ensure that "1" (which maps to 256B)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
             * is never the result used in the shifting logic below. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
            if (eeprom_size)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
                eeprom_size++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
            eeprom_size = (uint16_t)((eecd & E1000_EECD_SIZE_EX_MASK) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
                          E1000_EECD_SIZE_EX_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
        eeprom->word_size = 1 << (eeprom_size + EEPROM_WORD_SIZE_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
 * Raises the EEPROM's clock input.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
 * eecd - EECD's current value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
e1000_raise_ee_clk(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
                   uint32_t *eecd)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
    /* Raise the clock input to the EEPROM (by setting the SK bit), and then
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
     * wait <delay> microseconds.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
    *eecd = *eecd | E1000_EECD_SK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
    E1000_WRITE_REG(hw, EECD, *eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
    udelay(hw->eeprom.delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
 * Lowers the EEPROM's clock input.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
 * eecd - EECD's current value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
e1000_lower_ee_clk(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
                   uint32_t *eecd)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
    /* Lower the clock input to the EEPROM (by clearing the SK bit), and then
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
     * wait 50 microseconds.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
    *eecd = *eecd & ~E1000_EECD_SK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
    E1000_WRITE_REG(hw, EECD, *eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
    udelay(hw->eeprom.delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
 * Shift data bits out to the EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
 * data - data to send to the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
 * count - number of bits to shift out
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
e1000_shift_out_ee_bits(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
                        uint16_t data,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
                        uint16_t count)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
    uint32_t eecd;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
    uint32_t mask;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
    /* We need to shift "count" bits out to the EEPROM. So, value in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
     * "data" parameter will be shifted out to the EEPROM one bit at a time.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
     * In order to do this, "data" must be broken down into bits.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
    mask = 0x01 << (count - 1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
    eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
    if (eeprom->type == e1000_eeprom_microwire) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
        eecd &= ~E1000_EECD_DO;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
    } else if (eeprom->type == e1000_eeprom_spi) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
        eecd |= E1000_EECD_DO;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
        /* A "1" is shifted out to the EEPROM by setting bit "DI" to a "1",
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
         * and then raising and then lowering the clock (the SK bit controls
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
         * the clock input to the EEPROM).  A "0" is shifted out to the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
         * by setting "DI" to "0" and then raising and then lowering the clock.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
        eecd &= ~E1000_EECD_DI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
        if (data & mask)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
            eecd |= E1000_EECD_DI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
        udelay(eeprom->delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
        e1000_raise_ee_clk(hw, &eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
        e1000_lower_ee_clk(hw, &eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
        mask = mask >> 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
    } while (mask);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
    /* We leave the "DI" bit set to "0" when we leave this routine. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
    eecd &= ~E1000_EECD_DI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
    E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
 * Shift data bits in from the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
static uint16_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
e1000_shift_in_ee_bits(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
                       uint16_t count)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
    uint32_t eecd;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
    uint32_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
    uint16_t data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
    /* In order to read a register from the EEPROM, we need to shift 'count'
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
     * bits in from the EEPROM. Bits are "shifted in" by raising the clock
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
     * input to the EEPROM (setting the SK bit), and then reading the value of
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
     * the "DO" bit.  During this "shifting in" process the "DI" bit should
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
     * always be clear.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
    eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
    eecd &= ~(E1000_EECD_DO | E1000_EECD_DI);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
    data = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
    for (i = 0; i < count; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
        data = data << 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
        e1000_raise_ee_clk(hw, &eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
        eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
        eecd &= ~(E1000_EECD_DI);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
        if (eecd & E1000_EECD_DO)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
            data |= 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
        e1000_lower_ee_clk(hw, &eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
    return data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
 * Prepares EEPROM for access
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
 * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
 * function should be called before issuing a command to the EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
e1000_acquire_eeprom(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
    uint32_t eecd, i=0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
    DEBUGFUNC("e1000_acquire_eeprom");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
    if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
        return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
    eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
    if (hw->mac_type != e1000_82573) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
        /* Request EEPROM Access */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
        if (hw->mac_type > e1000_82544) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
            eecd |= E1000_EECD_REQ;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
            E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
            eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
            while ((!(eecd & E1000_EECD_GNT)) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
                  (i < E1000_EEPROM_GRANT_ATTEMPTS)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
                i++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
                udelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
                eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
            if (!(eecd & E1000_EECD_GNT)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
                eecd &= ~E1000_EECD_REQ;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
                E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
                DEBUGOUT("Could not acquire EEPROM grant\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
                e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
                return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
    /* Setup EEPROM for Read/Write */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
    if (eeprom->type == e1000_eeprom_microwire) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
        /* Clear SK and DI */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
        eecd &= ~(E1000_EECD_DI | E1000_EECD_SK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
        /* Set CS */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
        eecd |= E1000_EECD_CS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
    } else if (eeprom->type == e1000_eeprom_spi) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
        /* Clear SK and CS */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
        eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
        udelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
 * Returns EEPROM to a "standby" state
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
e1000_standby_eeprom(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
    uint32_t eecd;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
    eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
    if (eeprom->type == e1000_eeprom_microwire) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
        eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
        udelay(eeprom->delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
        /* Clock high */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
        eecd |= E1000_EECD_SK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
        udelay(eeprom->delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
        /* Select EEPROM */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
        eecd |= E1000_EECD_CS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
        udelay(eeprom->delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
        /* Clock low */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
        eecd &= ~E1000_EECD_SK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
        udelay(eeprom->delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
    } else if (eeprom->type == e1000_eeprom_spi) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
        /* Toggle CS to flush commands */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
        eecd |= E1000_EECD_CS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
        udelay(eeprom->delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
        eecd &= ~E1000_EECD_CS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
        udelay(eeprom->delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
 * Terminates a command by inverting the EEPROM's chip select pin
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
e1000_release_eeprom(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
    uint32_t eecd;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
    DEBUGFUNC("e1000_release_eeprom");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
    eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
    if (hw->eeprom.type == e1000_eeprom_spi) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
        eecd |= E1000_EECD_CS;  /* Pull CS high */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
        eecd &= ~E1000_EECD_SK; /* Lower SCK */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
        udelay(hw->eeprom.delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
    } else if (hw->eeprom.type == e1000_eeprom_microwire) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
        /* cleanup eeprom */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
        /* CS on Microwire is active-high */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
        eecd &= ~(E1000_EECD_CS | E1000_EECD_DI);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
        /* Rising edge of clock */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
        eecd |= E1000_EECD_SK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
        udelay(hw->eeprom.delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
        /* Falling edge of clock */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
        eecd &= ~E1000_EECD_SK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
        udelay(hw->eeprom.delay_usec);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
    /* Stop requesting EEPROM access */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
    if (hw->mac_type > e1000_82544) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
        eecd &= ~E1000_EECD_REQ;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
        E1000_WRITE_REG(hw, EECD, eecd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
    e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
 * Reads a 16 bit word from the EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
e1000_spi_eeprom_ready(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
    uint16_t retry_count = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
    uint8_t spi_stat_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
    DEBUGFUNC("e1000_spi_eeprom_ready");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
    /* Read "Status Register" repeatedly until the LSB is cleared.  The
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
     * EEPROM will signal that the command has been completed by clearing
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
     * bit 0 of the internal status register.  If it's not cleared within
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
     * 5 milliseconds, then error out.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
    retry_count = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
        e1000_shift_out_ee_bits(hw, EEPROM_RDSR_OPCODE_SPI,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
                                hw->eeprom.opcode_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
        spi_stat_reg = (uint8_t)e1000_shift_in_ee_bits(hw, 8);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
        if (!(spi_stat_reg & EEPROM_STATUS_RDY_SPI))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
        udelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
        retry_count += 5;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
        e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
    } while (retry_count < EEPROM_MAX_RETRY_SPI);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
    /* ATMEL SPI write time could vary from 0-20mSec on 3.3V devices (and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
     * only 0-5mSec on 5V devices)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
    if (retry_count >= EEPROM_MAX_RETRY_SPI) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
        DEBUGOUT("SPI EEPROM Status error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
 * Reads a 16 bit word from the EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
 * offset - offset of  word in the EEPROM to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
 * data - word read from the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
 * words - number of words to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
e1000_read_eeprom(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
                  uint16_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
                  uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
                  uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
    uint32_t i = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
    DEBUGFUNC("e1000_read_eeprom");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
    /* If eeprom is not yet detected, do so now */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
    if (eeprom->word_size == 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
        e1000_init_eeprom_params(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
    /* A check for invalid values:  offset too large, too many words, and not
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
     * enough words.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
    if ((offset >= eeprom->word_size) || (words > eeprom->word_size - offset) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
       (words == 0)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
        DEBUGOUT2("\"words\" parameter out of bounds. Words = %d, size = %d\n", offset, eeprom->word_size);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
    /* EEPROM's that don't use EERD to read require us to bit-bang the SPI
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
     * directly. In this case, we need to acquire the EEPROM so that
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
     * FW or other port software does not interrupt.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
    if (e1000_is_onboard_nvm_eeprom(hw) == TRUE &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
        hw->eeprom.use_eerd == FALSE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
        /* Prepare the EEPROM for bit-bang reading */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
        if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
    /* Eerd register EEPROM access requires no eeprom aquire/release */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
    if (eeprom->use_eerd == TRUE)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
        return e1000_read_eeprom_eerd(hw, offset, words, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
    /* ICH EEPROM access is done via the ICH flash controller */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
    if (eeprom->type == e1000_eeprom_ich8)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
        return e1000_read_eeprom_ich8(hw, offset, words, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
    /* Set up the SPI or Microwire EEPROM for bit-bang reading.  We have
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
     * acquired the EEPROM at this point, so any returns should relase it */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
    if (eeprom->type == e1000_eeprom_spi) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
        uint16_t word_in;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
        uint8_t read_opcode = EEPROM_READ_OPCODE_SPI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
        if (e1000_spi_eeprom_ready(hw)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
            e1000_release_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
        e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
        /* Some SPI eeproms use the 8th address bit embedded in the opcode */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
        if ((eeprom->address_bits == 8) && (offset >= 128))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
            read_opcode |= EEPROM_A8_OPCODE_SPI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
        /* Send the READ command (opcode + addr)  */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
        e1000_shift_out_ee_bits(hw, read_opcode, eeprom->opcode_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
        e1000_shift_out_ee_bits(hw, (uint16_t)(offset*2), eeprom->address_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
        /* Read the data.  The address of the eeprom internally increments with
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
         * each byte (spi) being read, saving on the overhead of eeprom setup
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
         * and tear-down.  The address counter will roll over if reading beyond
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
         * the size of the eeprom, thus allowing the entire memory to be read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
         * starting from any offset. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
        for (i = 0; i < words; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
            word_in = e1000_shift_in_ee_bits(hw, 16);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
            data[i] = (word_in >> 8) | (word_in << 8);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
    } else if (eeprom->type == e1000_eeprom_microwire) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
        for (i = 0; i < words; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
            /* Send the READ command (opcode + addr)  */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
            e1000_shift_out_ee_bits(hw, EEPROM_READ_OPCODE_MICROWIRE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
                                    eeprom->opcode_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
            e1000_shift_out_ee_bits(hw, (uint16_t)(offset + i),
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
                                    eeprom->address_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
            /* Read the data.  For microwire, each word requires the overhead
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
             * of eeprom setup and tear-down. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
            data[i] = e1000_shift_in_ee_bits(hw, 16);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
            e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
    /* End this read operation */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
    e1000_release_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
 * Reads a 16 bit word from the EEPROM using the EERD register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
 * offset - offset of  word in the EEPROM to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
 * data - word read from the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
 * words - number of words to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
e1000_read_eeprom_eerd(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
                  uint16_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
                  uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
                  uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
    uint32_t i, eerd = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
    int32_t error = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
    for (i = 0; i < words; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
        eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) +
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
                         E1000_EEPROM_RW_REG_START;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
        E1000_WRITE_REG(hw, EERD, eerd);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
        error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
        if (error) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
        data[i] = (E1000_READ_REG(hw, EERD) >> E1000_EEPROM_RW_REG_DATA);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
 * Writes a 16 bit word from the EEPROM using the EEWR register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
 * offset - offset of  word in the EEPROM to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
 * data - word read from the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
 * words - number of words to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
e1000_write_eeprom_eewr(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
                   uint16_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
                   uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
                   uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
    uint32_t    register_value = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
    uint32_t    i              = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
    int32_t     error          = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
    if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
        return -E1000_ERR_SWFW_SYNC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
    for (i = 0; i < words; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
        register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
                         ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
                         E1000_EEPROM_RW_REG_START;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5122
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5123
        error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
        if (error) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5126
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
        E1000_WRITE_REG(hw, EEWR, register_value);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5129
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
        error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
        if (error) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5137
    e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5139
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5141
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5142
 * Polls the status bit (bit 1) of the EERD to determine when the read is done.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5144
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5145
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
    uint32_t attempts = 100000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
    uint32_t i, reg = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
    int32_t done = E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
    for (i = 0; i < attempts; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
        if (eerd == E1000_EEPROM_POLL_READ)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5155
            reg = E1000_READ_REG(hw, EERD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5156
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
            reg = E1000_READ_REG(hw, EEWR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5158
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5159
        if (reg & E1000_EEPROM_RW_REG_DONE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5160
            done = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5161
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5163
        udelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5166
    return done;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5167
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
* Description:     Determines if the onboard NVM is FLASH or EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
*
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
* hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
static boolean_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5175
e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5176
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
    uint32_t eecd = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5179
    DEBUGFUNC("e1000_is_onboard_nvm_eeprom");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
        return FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5184
    if (hw->mac_type == e1000_82573) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5185
        eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
        /* Isolate bits 15 & 16 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5188
        eecd = ((eecd >> 15) & 0x03);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
        /* If both bits are set, device is Flash type */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5191
        if (eecd == 0x03) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
            return FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
    return TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5199
 * Verifies that the EEPROM has a valid checksum
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5200
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
 * Reads the first 64 16 bit words of the EEPROM and sums the values read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
 * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
 * valid.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5206
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5208
e1000_validate_eeprom_checksum(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
    uint16_t checksum = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5211
    uint16_t i, eeprom_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
    DEBUGFUNC("e1000_validate_eeprom_checksum");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
    if ((hw->mac_type == e1000_82573) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
        (e1000_is_onboard_nvm_eeprom(hw) == FALSE)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5217
        /* Check bit 4 of word 10h.  If it is 0, firmware is done updating
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5218
         * 10h-12h.  Checksum may need to be fixed. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
        e1000_read_eeprom(hw, 0x10, 1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
        if ((eeprom_data & 0x10) == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
            /* Read 0x23 and check bit 15.  This bit is a 1 when the checksum
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
             * has already been fixed.  If the checksum is still wrong and this
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
             * bit is a 1, we need to return bad checksum.  Otherwise, we need
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
             * to set this bit to a 1 and update the checksum. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
            e1000_read_eeprom(hw, 0x23, 1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
            if ((eeprom_data & 0x8000) == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
                eeprom_data |= 0x8000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
                e1000_write_eeprom(hw, 0x23, 1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5229
                e1000_update_eeprom_checksum(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
        /* Drivers must allocate the shadow ram structure for the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
         * EEPROM checksum to be updated.  Otherwise, this bit as well
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
         * as the checksum must both be set correctly for this
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
         * validation to pass.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
        e1000_read_eeprom(hw, 0x19, 1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
        if ((eeprom_data & 0x40) == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
            eeprom_data |= 0x40;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
            e1000_write_eeprom(hw, 0x19, 1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
            e1000_update_eeprom_checksum(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
    for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
        if (e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
            DEBUGOUT("EEPROM Read Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
        checksum += eeprom_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
    if (checksum == (uint16_t) EEPROM_SUM)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
    else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
        DEBUGOUT("EEPROM Checksum Invalid\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
 * Calculates the EEPROM checksum and writes it to the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5267
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5268
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5269
 * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
 * Writes the difference to word offset 63 of the EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5272
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
e1000_update_eeprom_checksum(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5274
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
    uint32_t ctrl_ext;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
    uint16_t checksum = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
    uint16_t i, eeprom_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5278
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
    DEBUGFUNC("e1000_update_eeprom_checksum");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
    for (i = 0; i < EEPROM_CHECKSUM_REG; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
        if (e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
            DEBUGOUT("EEPROM Read Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
        checksum += eeprom_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5288
    checksum = (uint16_t) EEPROM_SUM - checksum;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5289
    if (e1000_write_eeprom(hw, EEPROM_CHECKSUM_REG, 1, &checksum) < 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
        DEBUGOUT("EEPROM Write Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
    } else if (hw->eeprom.type == e1000_eeprom_flash) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
        e1000_commit_shadow_ram(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
    } else if (hw->eeprom.type == e1000_eeprom_ich8) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
        e1000_commit_shadow_ram(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
        /* Reload the EEPROM, or else modifications will not appear
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
         * until after next adapter reset. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
        ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
        ctrl_ext |= E1000_CTRL_EXT_EE_RST;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
        E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
        msleep(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
 * Parent function for writing words to the different EEPROM types.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
 * offset - offset within the EEPROM to be written to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
 * words - number of words to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
 * data - 16 bit word to be written to the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
 * If e1000_update_eeprom_checksum is not called after this function, the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
 * EEPROM will most likely contain an invalid checksum.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5317
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
e1000_write_eeprom(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
                   uint16_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
                   uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
                   uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5323
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5324
    int32_t status = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5325
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5326
    DEBUGFUNC("e1000_write_eeprom");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5327
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5328
    /* If eeprom is not yet detected, do so now */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5329
    if (eeprom->word_size == 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5330
        e1000_init_eeprom_params(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5331
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5332
    /* A check for invalid values:  offset too large, too many words, and not
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5333
     * enough words.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5334
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5335
    if ((offset >= eeprom->word_size) || (words > eeprom->word_size - offset) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5336
       (words == 0)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5337
        DEBUGOUT("\"words\" parameter out of bounds\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5338
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5339
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5340
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5341
    /* 82573 writes only through eewr */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5342
    if (eeprom->use_eewr == TRUE)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5343
        return e1000_write_eeprom_eewr(hw, offset, words, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5344
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5345
    if (eeprom->type == e1000_eeprom_ich8)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5346
        return e1000_write_eeprom_ich8(hw, offset, words, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5347
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5348
    /* Prepare the EEPROM for writing  */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5349
    if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5350
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5351
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5352
    if (eeprom->type == e1000_eeprom_microwire) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5353
        status = e1000_write_eeprom_microwire(hw, offset, words, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5354
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5355
        status = e1000_write_eeprom_spi(hw, offset, words, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5356
        msleep(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5357
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5358
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5359
    /* Done with writing */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5360
    e1000_release_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5361
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5362
    return status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5363
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5364
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5365
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5366
 * Writes a 16 bit word to a given offset in an SPI EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5367
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5368
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5369
 * offset - offset within the EEPROM to be written to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5370
 * words - number of words to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5371
 * data - pointer to array of 8 bit words to be written to the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5372
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5373
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5374
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5375
e1000_write_eeprom_spi(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5376
                       uint16_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5377
                       uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5378
                       uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5379
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5380
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5381
    uint16_t widx = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5382
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5383
    DEBUGFUNC("e1000_write_eeprom_spi");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5384
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5385
    while (widx < words) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5386
        uint8_t write_opcode = EEPROM_WRITE_OPCODE_SPI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5387
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5388
        if (e1000_spi_eeprom_ready(hw)) return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5389
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5390
        e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5391
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5392
        /*  Send the WRITE ENABLE command (8 bit opcode )  */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5393
        e1000_shift_out_ee_bits(hw, EEPROM_WREN_OPCODE_SPI,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5394
                                    eeprom->opcode_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5395
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5396
        e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5397
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5398
        /* Some SPI eeproms use the 8th address bit embedded in the opcode */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5399
        if ((eeprom->address_bits == 8) && (offset >= 128))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5400
            write_opcode |= EEPROM_A8_OPCODE_SPI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5401
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5402
        /* Send the Write command (8-bit opcode + addr) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5403
        e1000_shift_out_ee_bits(hw, write_opcode, eeprom->opcode_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5404
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5405
        e1000_shift_out_ee_bits(hw, (uint16_t)((offset + widx)*2),
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5406
                                eeprom->address_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5407
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5408
        /* Send the data */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5409
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5410
        /* Loop to allow for up to whole page write (32 bytes) of eeprom */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5411
        while (widx < words) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5412
            uint16_t word_out = data[widx];
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5413
            word_out = (word_out >> 8) | (word_out << 8);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5414
            e1000_shift_out_ee_bits(hw, word_out, 16);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5415
            widx++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5416
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5417
            /* Some larger eeprom sizes are capable of a 32-byte PAGE WRITE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5418
             * operation, while the smaller eeproms are capable of an 8-byte
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5419
             * PAGE WRITE operation.  Break the inner loop to pass new address
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5420
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5421
            if ((((offset + widx)*2) % eeprom->page_size) == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5422
                e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5423
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5424
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5425
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5426
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5427
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5428
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5429
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5430
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5431
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5432
 * Writes a 16 bit word to a given offset in a Microwire EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5433
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5434
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5435
 * offset - offset within the EEPROM to be written to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5436
 * words - number of words to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5437
 * data - pointer to array of 16 bit words to be written to the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5438
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5439
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5440
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5441
e1000_write_eeprom_microwire(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5442
                             uint16_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5443
                             uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5444
                             uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5445
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5446
    struct e1000_eeprom_info *eeprom = &hw->eeprom;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5447
    uint32_t eecd;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5448
    uint16_t words_written = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5449
    uint16_t i = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5450
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5451
    DEBUGFUNC("e1000_write_eeprom_microwire");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5452
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5453
    /* Send the write enable command to the EEPROM (3-bit opcode plus
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5454
     * 6/8-bit dummy address beginning with 11).  It's less work to include
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5455
     * the 11 of the dummy address as part of the opcode than it is to shift
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5456
     * it over the correct number of bits for the address.  This puts the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5457
     * EEPROM into write/erase mode.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5458
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5459
    e1000_shift_out_ee_bits(hw, EEPROM_EWEN_OPCODE_MICROWIRE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5460
                            (uint16_t)(eeprom->opcode_bits + 2));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5461
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5462
    e1000_shift_out_ee_bits(hw, 0, (uint16_t)(eeprom->address_bits - 2));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5463
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5464
    /* Prepare the EEPROM */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5465
    e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5466
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5467
    while (words_written < words) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5468
        /* Send the Write command (3-bit opcode + addr) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5469
        e1000_shift_out_ee_bits(hw, EEPROM_WRITE_OPCODE_MICROWIRE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5470
                                eeprom->opcode_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5471
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5472
        e1000_shift_out_ee_bits(hw, (uint16_t)(offset + words_written),
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5473
                                eeprom->address_bits);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5474
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5475
        /* Send the data */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5476
        e1000_shift_out_ee_bits(hw, data[words_written], 16);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5477
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5478
        /* Toggle the CS line.  This in effect tells the EEPROM to execute
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5479
         * the previous command.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5480
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5481
        e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5482
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5483
        /* Read DO repeatedly until it is high (equal to '1').  The EEPROM will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5484
         * signal that the command has been completed by raising the DO signal.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5485
         * If DO does not go high in 10 milliseconds, then error out.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5486
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5487
        for (i = 0; i < 200; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5488
            eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5489
            if (eecd & E1000_EECD_DO) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5490
            udelay(50);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5491
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5492
        if (i == 200) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5493
            DEBUGOUT("EEPROM Write did not complete\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5494
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5495
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5496
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5497
        /* Recover from write */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5498
        e1000_standby_eeprom(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5499
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5500
        words_written++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5501
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5502
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5503
    /* Send the write disable command to the EEPROM (3-bit opcode plus
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5504
     * 6/8-bit dummy address beginning with 10).  It's less work to include
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5505
     * the 10 of the dummy address as part of the opcode than it is to shift
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5506
     * it over the correct number of bits for the address.  This takes the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5507
     * EEPROM out of write/erase mode.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5508
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5509
    e1000_shift_out_ee_bits(hw, EEPROM_EWDS_OPCODE_MICROWIRE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5510
                            (uint16_t)(eeprom->opcode_bits + 2));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5511
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5512
    e1000_shift_out_ee_bits(hw, 0, (uint16_t)(eeprom->address_bits - 2));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5513
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5514
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5515
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5516
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5517
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5518
 * Flushes the cached eeprom to NVM. This is done by saving the modified values
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5519
 * in the eeprom cache and the non modified values in the currently active bank
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5520
 * to the new bank.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5521
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5522
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5523
 * offset - offset of  word in the EEPROM to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5524
 * data - word read from the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5525
 * words - number of words to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5526
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5527
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5528
e1000_commit_shadow_ram(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5529
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5530
    uint32_t attempts = 100000;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5531
    uint32_t eecd = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5532
    uint32_t flop = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5533
    uint32_t i = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5534
    int32_t error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5535
    uint32_t old_bank_offset = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5536
    uint32_t new_bank_offset = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5537
    uint8_t low_byte = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5538
    uint8_t high_byte = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5539
    boolean_t sector_write_failed = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5540
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5541
    if (hw->mac_type == e1000_82573) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5542
        /* The flop register will be used to determine if flash type is STM */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5543
        flop = E1000_READ_REG(hw, FLOP);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5544
        for (i=0; i < attempts; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5545
            eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5546
            if ((eecd & E1000_EECD_FLUPD) == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5547
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5548
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5549
            udelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5550
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5551
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5552
        if (i == attempts) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5553
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5554
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5555
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5556
        /* If STM opcode located in bits 15:8 of flop, reset firmware */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5557
        if ((flop & 0xFF00) == E1000_STM_OPCODE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5558
            E1000_WRITE_REG(hw, HICR, E1000_HICR_FW_RESET);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5559
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5560
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5561
        /* Perform the flash update */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5562
        E1000_WRITE_REG(hw, EECD, eecd | E1000_EECD_FLUPD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5563
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5564
        for (i=0; i < attempts; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5565
            eecd = E1000_READ_REG(hw, EECD);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5566
            if ((eecd & E1000_EECD_FLUPD) == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5567
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5568
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5569
            udelay(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5570
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5571
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5572
        if (i == attempts) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5573
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5574
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5575
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5576
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5577
    if (hw->mac_type == e1000_ich8lan && hw->eeprom_shadow_ram != NULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5578
        /* We're writing to the opposite bank so if we're on bank 1,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5579
         * write to bank 0 etc.  We also need to erase the segment that
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5580
         * is going to be written */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5581
        if (!(E1000_READ_REG(hw, EECD) & E1000_EECD_SEC1VAL)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5582
            new_bank_offset = hw->flash_bank_size * 2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5583
            old_bank_offset = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5584
            e1000_erase_ich8_4k_segment(hw, 1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5585
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5586
            old_bank_offset = hw->flash_bank_size * 2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5587
            new_bank_offset = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5588
            e1000_erase_ich8_4k_segment(hw, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5589
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5590
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5591
        sector_write_failed = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5592
        /* Loop for every byte in the shadow RAM,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5593
         * which is in units of words. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5594
        for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5595
            /* Determine whether to write the value stored
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5596
             * in the other NVM bank or a modified value stored
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5597
             * in the shadow RAM */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5598
            if (hw->eeprom_shadow_ram[i].modified == TRUE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5599
                low_byte = (uint8_t)hw->eeprom_shadow_ram[i].eeprom_word;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5600
                udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5601
                error = e1000_verify_write_ich8_byte(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5602
                            (i << 1) + new_bank_offset, low_byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5603
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5604
                if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5605
                    sector_write_failed = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5606
                else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5607
                    high_byte =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5608
                        (uint8_t)(hw->eeprom_shadow_ram[i].eeprom_word >> 8);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5609
                    udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5610
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5611
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5612
                e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5613
                                     &low_byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5614
                udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5615
                error = e1000_verify_write_ich8_byte(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5616
                            (i << 1) + new_bank_offset, low_byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5617
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5618
                if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5619
                    sector_write_failed = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5620
                else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5621
                    e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset + 1,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5622
                                         &high_byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5623
                    udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5624
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5625
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5626
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5627
            /* If the write of the low byte was successful, go ahread and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5628
             * write the high byte while checking to make sure that if it
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5629
             * is the signature byte, then it is handled properly */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5630
            if (sector_write_failed == FALSE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5631
                /* If the word is 0x13, then make sure the signature bits
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5632
                 * (15:14) are 11b until the commit has completed.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5633
                 * This will allow us to write 10b which indicates the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5634
                 * signature is valid.  We want to do this after the write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5635
                 * has completed so that we don't mark the segment valid
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5636
                 * while the write is still in progress */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5637
                if (i == E1000_ICH_NVM_SIG_WORD)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5638
                    high_byte = E1000_ICH_NVM_SIG_MASK | high_byte;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5639
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5640
                error = e1000_verify_write_ich8_byte(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5641
                            (i << 1) + new_bank_offset + 1, high_byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5642
                if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5643
                    sector_write_failed = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5644
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5645
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5646
                /* If the write failed then break from the loop and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5647
                 * return an error */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5648
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5649
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5650
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5651
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5652
        /* Don't bother writing the segment valid bits if sector
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5653
         * programming failed. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5654
        if (sector_write_failed == FALSE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5655
            /* Finally validate the new segment by setting bit 15:14
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5656
             * to 10b in word 0x13 , this can be done without an
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5657
             * erase as well since these bits are 11 to start with
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5658
             * and we need to change bit 14 to 0b */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5659
            e1000_read_ich8_byte(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5660
                                 E1000_ICH_NVM_SIG_WORD * 2 + 1 + new_bank_offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5661
                                 &high_byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5662
            high_byte &= 0xBF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5663
            error = e1000_verify_write_ich8_byte(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5664
                        E1000_ICH_NVM_SIG_WORD * 2 + 1 + new_bank_offset, high_byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5665
            /* And invalidate the previously valid segment by setting
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5666
             * its signature word (0x13) high_byte to 0b. This can be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5667
             * done without an erase because flash erase sets all bits
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5668
             * to 1's. We can write 1's to 0's without an erase */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5669
            if (error == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5670
                error = e1000_verify_write_ich8_byte(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5671
                            E1000_ICH_NVM_SIG_WORD * 2 + 1 + old_bank_offset, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5672
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5673
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5674
            /* Clear the now not used entry in the cache */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5675
            for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5676
                hw->eeprom_shadow_ram[i].modified = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5677
                hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5678
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5679
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5680
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5681
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5682
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5683
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5684
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5685
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5686
 * Reads the adapter's MAC address from the EEPROM and inverts the LSB for the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5687
 * second function of dual function devices
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5688
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5689
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5690
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5691
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5692
e1000_read_mac_addr(struct e1000_hw * hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5693
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5694
    uint16_t offset;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5695
    uint16_t eeprom_data, i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5696
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5697
    DEBUGFUNC("e1000_read_mac_addr");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5698
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5699
    for (i = 0; i < NODE_ADDRESS_SIZE; i += 2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5700
        offset = i >> 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5701
        if (e1000_read_eeprom(hw, offset, 1, &eeprom_data) < 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5702
            DEBUGOUT("EEPROM Read Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5703
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5704
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5705
        hw->perm_mac_addr[i] = (uint8_t) (eeprom_data & 0x00FF);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5706
        hw->perm_mac_addr[i+1] = (uint8_t) (eeprom_data >> 8);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5707
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5708
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5709
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5710
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5711
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5712
    case e1000_82546:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5713
    case e1000_82546_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5714
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5715
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5716
        if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5717
            hw->perm_mac_addr[5] ^= 0x01;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5718
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5719
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5720
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5721
    for (i = 0; i < NODE_ADDRESS_SIZE; i++)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5722
        hw->mac_addr[i] = hw->perm_mac_addr[i];
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5723
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5724
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5725
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5726
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5727
 * Initializes receive address filters.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5728
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5729
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5730
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5731
 * Places the MAC address in receive address register 0 and clears the rest
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5732
 * of the receive addresss registers. Clears the multicast table. Assumes
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5733
 * the receiver is in reset when the routine is called.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5734
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5735
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5736
e1000_init_rx_addrs(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5737
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5738
    uint32_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5739
    uint32_t rar_num;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5740
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5741
    DEBUGFUNC("e1000_init_rx_addrs");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5742
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5743
    /* Setup the receive address. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5744
    DEBUGOUT("Programming MAC Address into RAR[0]\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5745
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5746
    e1000_rar_set(hw, hw->mac_addr, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5747
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5748
    rar_num = E1000_RAR_ENTRIES;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5749
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5750
    /* Reserve a spot for the Locally Administered Address to work around
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5751
     * an 82571 issue in which a reset on one port will reload the MAC on
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5752
     * the other port. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5753
    if ((hw->mac_type == e1000_82571) && (hw->laa_is_present == TRUE))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5754
        rar_num -= 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5755
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5756
        rar_num = E1000_RAR_ENTRIES_ICH8LAN;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5757
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5758
    /* Zero out the other 15 receive addresses. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5759
    DEBUGOUT("Clearing RAR[1-15]\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5760
    for (i = 1; i < rar_num; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5761
        E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5762
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5763
        E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5764
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5765
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5766
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5767
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5768
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5769
 * Hashes an address to determine its location in the multicast table
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5770
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5771
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5772
 * mc_addr - the multicast address to hash
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5773
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5774
uint32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5775
e1000_hash_mc_addr(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5776
                   uint8_t *mc_addr)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5777
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5778
    uint32_t hash_value = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5779
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5780
    /* The portion of the address that is used for the hash table is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5781
     * determined by the mc_filter_type setting.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5782
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5783
    switch (hw->mc_filter_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5784
    /* [0] [1] [2] [3] [4] [5]
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5785
     * 01  AA  00  12  34  56
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5786
     * LSB                 MSB
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5787
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5788
    case 0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5789
        if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5790
            /* [47:38] i.e. 0x158 for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5791
            hash_value = ((mc_addr[4] >> 6) | (((uint16_t) mc_addr[5]) << 2));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5792
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5793
            /* [47:36] i.e. 0x563 for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5794
            hash_value = ((mc_addr[4] >> 4) | (((uint16_t) mc_addr[5]) << 4));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5795
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5796
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5797
    case 1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5798
        if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5799
            /* [46:37] i.e. 0x2B1 for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5800
            hash_value = ((mc_addr[4] >> 5) | (((uint16_t) mc_addr[5]) << 3));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5801
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5802
            /* [46:35] i.e. 0xAC6 for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5803
            hash_value = ((mc_addr[4] >> 3) | (((uint16_t) mc_addr[5]) << 5));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5804
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5805
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5806
    case 2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5807
        if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5808
            /*[45:36] i.e. 0x163 for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5809
            hash_value = ((mc_addr[4] >> 4) | (((uint16_t) mc_addr[5]) << 4));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5810
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5811
            /* [45:34] i.e. 0x5D8 for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5812
            hash_value = ((mc_addr[4] >> 2) | (((uint16_t) mc_addr[5]) << 6));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5813
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5814
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5815
    case 3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5816
        if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5817
            /* [43:34] i.e. 0x18D for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5818
            hash_value = ((mc_addr[4] >> 2) | (((uint16_t) mc_addr[5]) << 6));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5819
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5820
            /* [43:32] i.e. 0x634 for above example address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5821
            hash_value = ((mc_addr[4]) | (((uint16_t) mc_addr[5]) << 8));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5822
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5823
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5824
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5825
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5826
    hash_value &= 0xFFF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5827
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5828
        hash_value &= 0x3FF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5829
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5830
    return hash_value;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5831
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5832
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5833
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5834
 * Sets the bit in the multicast table corresponding to the hash value.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5835
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5836
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5837
 * hash_value - Multicast address hash value
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5838
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5839
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5840
e1000_mta_set(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5841
              uint32_t hash_value)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5842
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5843
    uint32_t hash_bit, hash_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5844
    uint32_t mta;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5845
    uint32_t temp;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5846
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5847
    /* The MTA is a register array of 128 32-bit registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5848
     * It is treated like an array of 4096 bits.  We want to set
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5849
     * bit BitArray[hash_value]. So we figure out what register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5850
     * the bit is in, read it, OR in the new bit, then write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5851
     * back the new value.  The register is determined by the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5852
     * upper 7 bits of the hash value and the bit within that
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5853
     * register are determined by the lower 5 bits of the value.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5854
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5855
    hash_reg = (hash_value >> 5) & 0x7F;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5856
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5857
        hash_reg &= 0x1F;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5858
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5859
    hash_bit = hash_value & 0x1F;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5860
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5861
    mta = E1000_READ_REG_ARRAY(hw, MTA, hash_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5862
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5863
    mta |= (1 << hash_bit);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5864
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5865
    /* If we are on an 82544 and we are trying to write an odd offset
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5866
     * in the MTA, save off the previous entry before writing and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5867
     * restore the old value after writing.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5868
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5869
    if ((hw->mac_type == e1000_82544) && ((hash_reg & 0x1) == 1)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5870
        temp = E1000_READ_REG_ARRAY(hw, MTA, (hash_reg - 1));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5871
        E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5872
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5873
        E1000_WRITE_REG_ARRAY(hw, MTA, (hash_reg - 1), temp);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5874
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5875
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5876
        E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5877
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5878
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5879
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5880
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5881
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5882
 * Puts an ethernet address into a receive address register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5883
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5884
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5885
 * addr - Address to put into receive address register
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5886
 * index - Receive address register to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5887
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5888
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5889
e1000_rar_set(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5890
              uint8_t *addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5891
              uint32_t index)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5892
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5893
    uint32_t rar_low, rar_high;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5894
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5895
    /* HW expects these in little endian so we reverse the byte order
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5896
     * from network order (big endian) to little endian
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5897
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5898
    rar_low = ((uint32_t) addr[0] |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5899
               ((uint32_t) addr[1] << 8) |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5900
               ((uint32_t) addr[2] << 16) | ((uint32_t) addr[3] << 24));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5901
    rar_high = ((uint32_t) addr[4] | ((uint32_t) addr[5] << 8));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5902
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5903
    /* Disable Rx and flush all Rx frames before enabling RSS to avoid Rx
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5904
     * unit hang.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5905
     *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5906
     * Description:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5907
     * If there are any Rx frames queued up or otherwise present in the HW
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5908
     * before RSS is enabled, and then we enable RSS, the HW Rx unit will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5909
     * hang.  To work around this issue, we have to disable receives and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5910
     * flush out all Rx frames before we enable RSS. To do so, we modify we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5911
     * redirect all Rx traffic to manageability and then reset the HW.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5912
     * This flushes away Rx frames, and (since the redirections to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5913
     * manageability persists across resets) keeps new ones from coming in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5914
     * while we work.  Then, we clear the Address Valid AV bit for all MAC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5915
     * addresses and undo the re-direction to manageability.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5916
     * Now, frames are coming in again, but the MAC won't accept them, so
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5917
     * far so good.  We now proceed to initialize RSS (if necessary) and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5918
     * configure the Rx unit.  Last, we re-enable the AV bits and continue
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5919
     * on our merry way.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5920
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5921
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5922
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5923
    case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5924
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5925
        if (hw->leave_av_bit_off == TRUE)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5926
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5927
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5928
        /* Indicate to hardware the Address is Valid. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5929
        rar_high |= E1000_RAH_AV;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5930
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5931
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5932
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5933
    E1000_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5934
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5935
    E1000_WRITE_REG_ARRAY(hw, RA, ((index << 1) + 1), rar_high);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5936
    E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5937
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5938
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5939
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5940
 * Writes a value to the specified offset in the VLAN filter table.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5941
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5942
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5943
 * offset - Offset in VLAN filer table to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5944
 * value - Value to write into VLAN filter table
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5945
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5946
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5947
e1000_write_vfta(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5948
                 uint32_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5949
                 uint32_t value)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5950
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5951
    uint32_t temp;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5952
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5953
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5954
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5955
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5956
    if ((hw->mac_type == e1000_82544) && ((offset & 0x1) == 1)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5957
        temp = E1000_READ_REG_ARRAY(hw, VFTA, (offset - 1));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5958
        E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5959
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5960
        E1000_WRITE_REG_ARRAY(hw, VFTA, (offset - 1), temp);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5961
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5962
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5963
        E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5964
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5965
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5966
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5967
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5968
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5969
 * Clears the VLAN filer table
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5970
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5971
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5972
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5973
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5974
e1000_clear_vfta(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5975
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5976
    uint32_t offset;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5977
    uint32_t vfta_value = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5978
    uint32_t vfta_offset = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5979
    uint32_t vfta_bit_in_reg = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5980
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5981
    if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5982
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5983
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5984
    if (hw->mac_type == e1000_82573) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5985
        if (hw->mng_cookie.vlan_id != 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5986
            /* The VFTA is a 4096b bit-field, each identifying a single VLAN
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5987
             * ID.  The following operations determine which 32b entry
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5988
             * (i.e. offset) into the array we want to set the VLAN ID
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5989
             * (i.e. bit) of the manageability unit. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5990
            vfta_offset = (hw->mng_cookie.vlan_id >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5991
                           E1000_VFTA_ENTRY_SHIFT) &
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5992
                          E1000_VFTA_ENTRY_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5993
            vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id &
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5994
                                    E1000_VFTA_ENTRY_BIT_SHIFT_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5995
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5996
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5997
    for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5998
        /* If the offset we want to clear is the same offset of the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5999
         * manageability VLAN ID, then clear all bits except that of the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6000
         * manageability unit */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6001
        vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6002
        E1000_WRITE_REG_ARRAY(hw, VFTA, offset, vfta_value);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6003
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6004
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6005
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6006
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6007
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6008
e1000_id_led_init(struct e1000_hw * hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6009
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6010
    uint32_t ledctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6011
    const uint32_t ledctl_mask = 0x000000FF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6012
    const uint32_t ledctl_on = E1000_LEDCTL_MODE_LED_ON;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6013
    const uint32_t ledctl_off = E1000_LEDCTL_MODE_LED_OFF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6014
    uint16_t eeprom_data, i, temp;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6015
    const uint16_t led_mask = 0x0F;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6016
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6017
    DEBUGFUNC("e1000_id_led_init");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6018
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6019
    if (hw->mac_type < e1000_82540) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6020
        /* Nothing to do */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6021
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6022
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6023
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6024
    ledctl = E1000_READ_REG(hw, LEDCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6025
    hw->ledctl_default = ledctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6026
    hw->ledctl_mode1 = hw->ledctl_default;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6027
    hw->ledctl_mode2 = hw->ledctl_default;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6028
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6029
    if (e1000_read_eeprom(hw, EEPROM_ID_LED_SETTINGS, 1, &eeprom_data) < 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6030
        DEBUGOUT("EEPROM Read Error\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6031
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6032
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6033
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6034
    if ((hw->mac_type == e1000_82573) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6035
        (eeprom_data == ID_LED_RESERVED_82573))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6036
        eeprom_data = ID_LED_DEFAULT_82573;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6037
    else if ((eeprom_data == ID_LED_RESERVED_0000) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6038
            (eeprom_data == ID_LED_RESERVED_FFFF)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6039
        if (hw->mac_type == e1000_ich8lan)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6040
            eeprom_data = ID_LED_DEFAULT_ICH8LAN;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6041
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6042
            eeprom_data = ID_LED_DEFAULT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6043
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6044
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6045
    for (i = 0; i < 4; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6046
        temp = (eeprom_data >> (i << 2)) & led_mask;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6047
        switch (temp) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6048
        case ID_LED_ON1_DEF2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6049
        case ID_LED_ON1_ON2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6050
        case ID_LED_ON1_OFF2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6051
            hw->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6052
            hw->ledctl_mode1 |= ledctl_on << (i << 3);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6053
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6054
        case ID_LED_OFF1_DEF2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6055
        case ID_LED_OFF1_ON2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6056
        case ID_LED_OFF1_OFF2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6057
            hw->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6058
            hw->ledctl_mode1 |= ledctl_off << (i << 3);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6059
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6060
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6061
            /* Do nothing */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6062
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6063
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6064
        switch (temp) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6065
        case ID_LED_DEF1_ON2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6066
        case ID_LED_ON1_ON2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6067
        case ID_LED_OFF1_ON2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6068
            hw->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6069
            hw->ledctl_mode2 |= ledctl_on << (i << 3);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6070
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6071
        case ID_LED_DEF1_OFF2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6072
        case ID_LED_ON1_OFF2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6073
        case ID_LED_OFF1_OFF2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6074
            hw->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6075
            hw->ledctl_mode2 |= ledctl_off << (i << 3);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6076
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6077
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6078
            /* Do nothing */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6079
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6080
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6081
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6082
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6083
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6084
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6085
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6086
 * Prepares SW controlable LED for use and saves the current state of the LED.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6087
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6088
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6089
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6090
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6091
e1000_setup_led(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6092
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6093
    uint32_t ledctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6094
    int32_t ret_val = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6095
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6096
    DEBUGFUNC("e1000_setup_led");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6097
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6098
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6099
    case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6100
    case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6101
    case e1000_82543:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6102
    case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6103
        /* No setup necessary */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6104
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6105
    case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6106
    case e1000_82547:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6107
    case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6108
    case e1000_82547_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6109
        /* Turn off PHY Smart Power Down (if enabled) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6110
        ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6111
                                     &hw->phy_spd_default);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6112
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6113
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6114
        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6115
                                      (uint16_t)(hw->phy_spd_default &
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6116
                                      ~IGP01E1000_GMII_SPD));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6117
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6118
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6119
        /* Fall Through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6120
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6121
        if (hw->media_type == e1000_media_type_fiber) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6122
            ledctl = E1000_READ_REG(hw, LEDCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6123
            /* Save current LEDCTL settings */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6124
            hw->ledctl_default = ledctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6125
            /* Turn off LED0 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6126
            ledctl &= ~(E1000_LEDCTL_LED0_IVRT |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6127
                        E1000_LEDCTL_LED0_BLINK |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6128
                        E1000_LEDCTL_LED0_MODE_MASK);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6129
            ledctl |= (E1000_LEDCTL_MODE_LED_OFF <<
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6130
                       E1000_LEDCTL_LED0_MODE_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6131
            E1000_WRITE_REG(hw, LEDCTL, ledctl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6132
        } else if (hw->media_type == e1000_media_type_copper)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6133
            E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6134
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6135
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6136
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6137
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6138
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6139
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6140
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6141
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6142
 * Used on 82571 and later Si that has LED blink bits.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6143
 * Callers must use their own timer and should have already called
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6144
 * e1000_id_led_init()
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6145
 * Call e1000_cleanup led() to stop blinking
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6146
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6147
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6148
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6149
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6150
e1000_blink_led_start(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6151
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6152
    int16_t  i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6153
    uint32_t ledctl_blink = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6154
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6155
    DEBUGFUNC("e1000_id_led_blink_on");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6156
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6157
    if (hw->mac_type < e1000_82571) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6158
        /* Nothing to do */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6159
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6160
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6161
    if (hw->media_type == e1000_media_type_fiber) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6162
        /* always blink LED0 for PCI-E fiber */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6163
        ledctl_blink = E1000_LEDCTL_LED0_BLINK |
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6164
                     (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6165
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6166
        /* set the blink bit for each LED that's "on" (0x0E) in ledctl_mode2 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6167
        ledctl_blink = hw->ledctl_mode2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6168
        for (i=0; i < 4; i++)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6169
            if (((hw->ledctl_mode2 >> (i * 8)) & 0xFF) ==
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6170
                E1000_LEDCTL_MODE_LED_ON)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6171
                ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << (i * 8));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6172
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6173
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6174
    E1000_WRITE_REG(hw, LEDCTL, ledctl_blink);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6175
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6176
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6177
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6178
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6179
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6180
 * Restores the saved state of the SW controlable LED.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6181
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6182
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6183
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6184
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6185
e1000_cleanup_led(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6186
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6187
    int32_t ret_val = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6188
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6189
    DEBUGFUNC("e1000_cleanup_led");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6190
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6191
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6192
    case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6193
    case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6194
    case e1000_82543:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6195
    case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6196
        /* No cleanup necessary */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6197
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6198
    case e1000_82541:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6199
    case e1000_82547:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6200
    case e1000_82541_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6201
    case e1000_82547_rev_2:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6202
        /* Turn on PHY Smart Power Down (if previously enabled) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6203
        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6204
                                      hw->phy_spd_default);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6205
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6206
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6207
        /* Fall Through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6208
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6209
        if (hw->phy_type == e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6210
            e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6211
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6212
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6213
        /* Restore LEDCTL settings */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6214
        E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_default);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6215
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6216
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6217
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6218
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6219
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6220
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6221
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6222
 * Turns on the software controllable LED
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6223
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6224
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6225
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6226
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6227
e1000_led_on(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6228
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6229
    uint32_t ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6230
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6231
    DEBUGFUNC("e1000_led_on");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6232
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6233
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6234
    case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6235
    case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6236
    case e1000_82543:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6237
        /* Set SW Defineable Pin 0 to turn on the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6238
        ctrl |= E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6239
        ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6240
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6241
    case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6242
        if (hw->media_type == e1000_media_type_fiber) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6243
            /* Set SW Defineable Pin 0 to turn on the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6244
            ctrl |= E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6245
            ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6246
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6247
            /* Clear SW Defineable Pin 0 to turn on the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6248
            ctrl &= ~E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6249
            ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6250
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6251
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6252
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6253
        if (hw->media_type == e1000_media_type_fiber) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6254
            /* Clear SW Defineable Pin 0 to turn on the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6255
            ctrl &= ~E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6256
            ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6257
        } else if (hw->phy_type == e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6258
            e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6259
                 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6260
        } else if (hw->media_type == e1000_media_type_copper) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6261
            E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6262
            return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6263
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6264
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6265
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6266
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6267
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6268
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6269
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6270
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6271
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6272
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6273
 * Turns off the software controllable LED
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6274
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6275
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6276
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6277
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6278
e1000_led_off(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6279
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6280
    uint32_t ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6281
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6282
    DEBUGFUNC("e1000_led_off");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6283
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6284
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6285
    case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6286
    case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6287
    case e1000_82543:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6288
        /* Clear SW Defineable Pin 0 to turn off the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6289
        ctrl &= ~E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6290
        ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6291
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6292
    case e1000_82544:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6293
        if (hw->media_type == e1000_media_type_fiber) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6294
            /* Clear SW Defineable Pin 0 to turn off the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6295
            ctrl &= ~E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6296
            ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6297
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6298
            /* Set SW Defineable Pin 0 to turn off the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6299
            ctrl |= E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6300
            ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6301
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6302
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6303
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6304
        if (hw->media_type == e1000_media_type_fiber) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6305
            /* Set SW Defineable Pin 0 to turn off the LED */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6306
            ctrl |= E1000_CTRL_SWDPIN0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6307
            ctrl |= E1000_CTRL_SWDPIO0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6308
        } else if (hw->phy_type == e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6309
            e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6310
                 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6311
        } else if (hw->media_type == e1000_media_type_copper) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6312
            E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6313
            return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6314
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6315
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6316
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6317
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6318
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6319
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6320
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6321
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6322
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6323
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6324
 * Clears all hardware statistics counters.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6325
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6326
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6327
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6328
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6329
e1000_clear_hw_cntrs(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6330
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6331
    volatile uint32_t temp;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6332
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6333
    temp = E1000_READ_REG(hw, CRCERRS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6334
    temp = E1000_READ_REG(hw, SYMERRS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6335
    temp = E1000_READ_REG(hw, MPC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6336
    temp = E1000_READ_REG(hw, SCC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6337
    temp = E1000_READ_REG(hw, ECOL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6338
    temp = E1000_READ_REG(hw, MCC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6339
    temp = E1000_READ_REG(hw, LATECOL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6340
    temp = E1000_READ_REG(hw, COLC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6341
    temp = E1000_READ_REG(hw, DC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6342
    temp = E1000_READ_REG(hw, SEC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6343
    temp = E1000_READ_REG(hw, RLEC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6344
    temp = E1000_READ_REG(hw, XONRXC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6345
    temp = E1000_READ_REG(hw, XONTXC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6346
    temp = E1000_READ_REG(hw, XOFFRXC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6347
    temp = E1000_READ_REG(hw, XOFFTXC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6348
    temp = E1000_READ_REG(hw, FCRUC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6349
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6350
    if (hw->mac_type != e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6351
    temp = E1000_READ_REG(hw, PRC64);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6352
    temp = E1000_READ_REG(hw, PRC127);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6353
    temp = E1000_READ_REG(hw, PRC255);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6354
    temp = E1000_READ_REG(hw, PRC511);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6355
    temp = E1000_READ_REG(hw, PRC1023);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6356
    temp = E1000_READ_REG(hw, PRC1522);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6357
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6358
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6359
    temp = E1000_READ_REG(hw, GPRC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6360
    temp = E1000_READ_REG(hw, BPRC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6361
    temp = E1000_READ_REG(hw, MPRC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6362
    temp = E1000_READ_REG(hw, GPTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6363
    temp = E1000_READ_REG(hw, GORCL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6364
    temp = E1000_READ_REG(hw, GORCH);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6365
    temp = E1000_READ_REG(hw, GOTCL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6366
    temp = E1000_READ_REG(hw, GOTCH);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6367
    temp = E1000_READ_REG(hw, RNBC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6368
    temp = E1000_READ_REG(hw, RUC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6369
    temp = E1000_READ_REG(hw, RFC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6370
    temp = E1000_READ_REG(hw, ROC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6371
    temp = E1000_READ_REG(hw, RJC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6372
    temp = E1000_READ_REG(hw, TORL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6373
    temp = E1000_READ_REG(hw, TORH);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6374
    temp = E1000_READ_REG(hw, TOTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6375
    temp = E1000_READ_REG(hw, TOTH);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6376
    temp = E1000_READ_REG(hw, TPR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6377
    temp = E1000_READ_REG(hw, TPT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6378
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6379
    if (hw->mac_type != e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6380
    temp = E1000_READ_REG(hw, PTC64);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6381
    temp = E1000_READ_REG(hw, PTC127);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6382
    temp = E1000_READ_REG(hw, PTC255);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6383
    temp = E1000_READ_REG(hw, PTC511);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6384
    temp = E1000_READ_REG(hw, PTC1023);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6385
    temp = E1000_READ_REG(hw, PTC1522);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6386
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6387
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6388
    temp = E1000_READ_REG(hw, MPTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6389
    temp = E1000_READ_REG(hw, BPTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6390
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6391
    if (hw->mac_type < e1000_82543) return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6392
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6393
    temp = E1000_READ_REG(hw, ALGNERRC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6394
    temp = E1000_READ_REG(hw, RXERRC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6395
    temp = E1000_READ_REG(hw, TNCRS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6396
    temp = E1000_READ_REG(hw, CEXTERR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6397
    temp = E1000_READ_REG(hw, TSCTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6398
    temp = E1000_READ_REG(hw, TSCTFC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6399
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6400
    if (hw->mac_type <= e1000_82544) return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6401
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6402
    temp = E1000_READ_REG(hw, MGTPRC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6403
    temp = E1000_READ_REG(hw, MGTPDC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6404
    temp = E1000_READ_REG(hw, MGTPTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6405
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6406
    if (hw->mac_type <= e1000_82547_rev_2) return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6407
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6408
    temp = E1000_READ_REG(hw, IAC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6409
    temp = E1000_READ_REG(hw, ICRXOC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6410
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6411
    if (hw->mac_type == e1000_ich8lan) return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6412
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6413
    temp = E1000_READ_REG(hw, ICRXPTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6414
    temp = E1000_READ_REG(hw, ICRXATC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6415
    temp = E1000_READ_REG(hw, ICTXPTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6416
    temp = E1000_READ_REG(hw, ICTXATC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6417
    temp = E1000_READ_REG(hw, ICTXQEC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6418
    temp = E1000_READ_REG(hw, ICTXQMTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6419
    temp = E1000_READ_REG(hw, ICRXDMTC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6420
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6421
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6422
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6423
 * Resets Adaptive IFS to its default state.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6424
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6425
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6426
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6427
 * Call this after e1000_init_hw. You may override the IFS defaults by setting
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6428
 * hw->ifs_params_forced to TRUE. However, you must initialize hw->
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6429
 * current_ifs_val, ifs_min_val, ifs_max_val, ifs_step_size, and ifs_ratio
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6430
 * before calling this function.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6431
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6432
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6433
e1000_reset_adaptive(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6434
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6435
    DEBUGFUNC("e1000_reset_adaptive");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6436
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6437
    if (hw->adaptive_ifs) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6438
        if (!hw->ifs_params_forced) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6439
            hw->current_ifs_val = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6440
            hw->ifs_min_val = IFS_MIN;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6441
            hw->ifs_max_val = IFS_MAX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6442
            hw->ifs_step_size = IFS_STEP;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6443
            hw->ifs_ratio = IFS_RATIO;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6444
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6445
        hw->in_ifs_mode = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6446
        E1000_WRITE_REG(hw, AIT, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6447
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6448
        DEBUGOUT("Not in Adaptive IFS mode!\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6449
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6450
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6451
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6452
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6453
 * Called during the callback/watchdog routine to update IFS value based on
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6454
 * the ratio of transmits to collisions.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6455
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6456
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6457
 * tx_packets - Number of transmits since last callback
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6458
 * total_collisions - Number of collisions since last callback
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6459
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6460
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6461
e1000_update_adaptive(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6462
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6463
    DEBUGFUNC("e1000_update_adaptive");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6464
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6465
    if (hw->adaptive_ifs) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6466
        if ((hw->collision_delta * hw->ifs_ratio) > hw->tx_packet_delta) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6467
            if (hw->tx_packet_delta > MIN_NUM_XMITS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6468
                hw->in_ifs_mode = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6469
                if (hw->current_ifs_val < hw->ifs_max_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6470
                    if (hw->current_ifs_val == 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6471
                        hw->current_ifs_val = hw->ifs_min_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6472
                    else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6473
                        hw->current_ifs_val += hw->ifs_step_size;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6474
                    E1000_WRITE_REG(hw, AIT, hw->current_ifs_val);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6475
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6476
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6477
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6478
            if (hw->in_ifs_mode && (hw->tx_packet_delta <= MIN_NUM_XMITS)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6479
                hw->current_ifs_val = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6480
                hw->in_ifs_mode = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6481
                E1000_WRITE_REG(hw, AIT, 0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6482
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6483
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6484
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6485
        DEBUGOUT("Not in Adaptive IFS mode!\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6486
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6487
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6488
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6489
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6490
 * Adjusts the statistic counters when a frame is accepted by TBI_ACCEPT
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6491
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6492
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6493
 * frame_len - The length of the frame in question
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6494
 * mac_addr - The Ethernet destination address of the frame in question
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6495
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6496
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6497
e1000_tbi_adjust_stats(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6498
                       struct e1000_hw_stats *stats,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6499
                       uint32_t frame_len,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6500
                       uint8_t *mac_addr)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6501
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6502
    uint64_t carry_bit;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6503
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6504
    /* First adjust the frame length. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6505
    frame_len--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6506
    /* We need to adjust the statistics counters, since the hardware
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6507
     * counters overcount this packet as a CRC error and undercount
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6508
     * the packet as a good packet
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6509
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6510
    /* This packet should not be counted as a CRC error.    */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6511
    stats->crcerrs--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6512
    /* This packet does count as a Good Packet Received.    */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6513
    stats->gprc++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6514
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6515
    /* Adjust the Good Octets received counters             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6516
    carry_bit = 0x80000000 & stats->gorcl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6517
    stats->gorcl += frame_len;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6518
    /* If the high bit of Gorcl (the low 32 bits of the Good Octets
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6519
     * Received Count) was one before the addition,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6520
     * AND it is zero after, then we lost the carry out,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6521
     * need to add one to Gorch (Good Octets Received Count High).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6522
     * This could be simplified if all environments supported
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6523
     * 64-bit integers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6524
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6525
    if (carry_bit && ((stats->gorcl & 0x80000000) == 0))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6526
        stats->gorch++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6527
    /* Is this a broadcast or multicast?  Check broadcast first,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6528
     * since the test for a multicast frame will test positive on
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6529
     * a broadcast frame.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6530
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6531
    if ((mac_addr[0] == (uint8_t) 0xff) && (mac_addr[1] == (uint8_t) 0xff))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6532
        /* Broadcast packet */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6533
        stats->bprc++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6534
    else if (*mac_addr & 0x01)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6535
        /* Multicast packet */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6536
        stats->mprc++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6537
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6538
    if (frame_len == hw->max_frame_size) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6539
        /* In this case, the hardware has overcounted the number of
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6540
         * oversize frames.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6541
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6542
        if (stats->roc > 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6543
            stats->roc--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6544
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6545
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6546
    /* Adjust the bin counters when the extra byte put the frame in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6547
     * wrong bin. Remember that the frame_len was adjusted above.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6548
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6549
    if (frame_len == 64) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6550
        stats->prc64++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6551
        stats->prc127--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6552
    } else if (frame_len == 127) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6553
        stats->prc127++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6554
        stats->prc255--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6555
    } else if (frame_len == 255) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6556
        stats->prc255++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6557
        stats->prc511--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6558
    } else if (frame_len == 511) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6559
        stats->prc511++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6560
        stats->prc1023--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6561
    } else if (frame_len == 1023) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6562
        stats->prc1023++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6563
        stats->prc1522--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6564
    } else if (frame_len == 1522) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6565
        stats->prc1522++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6566
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6567
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6568
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6569
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6570
 * Gets the current PCI bus type, speed, and width of the hardware
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6571
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6572
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6573
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6574
void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6575
e1000_get_bus_info(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6576
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6577
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6578
    uint16_t pci_ex_link_status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6579
    uint32_t status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6580
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6581
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6582
    case e1000_82542_rev2_0:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6583
    case e1000_82542_rev2_1:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6584
        hw->bus_type = e1000_bus_type_pci;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6585
        hw->bus_speed = e1000_bus_speed_unknown;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6586
        hw->bus_width = e1000_bus_width_unknown;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6587
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6588
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6589
    case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6590
    case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6591
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6592
        hw->bus_type = e1000_bus_type_pci_express;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6593
        hw->bus_speed = e1000_bus_speed_2500;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6594
        ret_val = e1000_read_pcie_cap_reg(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6595
                                      PCI_EX_LINK_STATUS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6596
                                      &pci_ex_link_status);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6597
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6598
            hw->bus_width = e1000_bus_width_unknown;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6599
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6600
            hw->bus_width = (pci_ex_link_status & PCI_EX_LINK_WIDTH_MASK) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6601
                          PCI_EX_LINK_WIDTH_SHIFT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6602
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6603
    case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6604
        hw->bus_type = e1000_bus_type_pci_express;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6605
        hw->bus_speed = e1000_bus_speed_2500;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6606
        hw->bus_width = e1000_bus_width_pciex_1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6607
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6608
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6609
        status = E1000_READ_REG(hw, STATUS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6610
        hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6611
                       e1000_bus_type_pcix : e1000_bus_type_pci;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6612
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6613
        if (hw->device_id == E1000_DEV_ID_82546EB_QUAD_COPPER) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6614
            hw->bus_speed = (hw->bus_type == e1000_bus_type_pci) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6615
                            e1000_bus_speed_66 : e1000_bus_speed_120;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6616
        } else if (hw->bus_type == e1000_bus_type_pci) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6617
            hw->bus_speed = (status & E1000_STATUS_PCI66) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6618
                            e1000_bus_speed_66 : e1000_bus_speed_33;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6619
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6620
            switch (status & E1000_STATUS_PCIX_SPEED) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6621
            case E1000_STATUS_PCIX_SPEED_66:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6622
                hw->bus_speed = e1000_bus_speed_66;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6623
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6624
            case E1000_STATUS_PCIX_SPEED_100:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6625
                hw->bus_speed = e1000_bus_speed_100;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6626
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6627
            case E1000_STATUS_PCIX_SPEED_133:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6628
                hw->bus_speed = e1000_bus_speed_133;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6629
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6630
            default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6631
                hw->bus_speed = e1000_bus_speed_reserved;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6632
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6633
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6634
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6635
        hw->bus_width = (status & E1000_STATUS_BUS64) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6636
                        e1000_bus_width_64 : e1000_bus_width_32;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6637
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6638
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6639
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6640
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6641
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6642
 * Writes a value to one of the devices registers using port I/O (as opposed to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6643
 * memory mapped I/O). Only 82544 and newer devices support port I/O.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6644
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6645
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6646
 * offset - offset to write to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6647
 * value - value to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6648
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6649
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6650
e1000_write_reg_io(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6651
                   uint32_t offset,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6652
                   uint32_t value)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6653
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6654
    unsigned long io_addr = hw->io_base;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6655
    unsigned long io_data = hw->io_base + 4;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6656
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6657
    e1000_io_write(hw, io_addr, offset);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6658
    e1000_io_write(hw, io_data, value);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6659
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6660
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6661
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6662
 * Estimates the cable length.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6663
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6664
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6665
 * min_length - The estimated minimum length
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6666
 * max_length - The estimated maximum length
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6667
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6668
 * returns: - E1000_ERR_XXX
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6669
 *            E1000_SUCCESS
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6670
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6671
 * This function always returns a ranged length (minimum & maximum).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6672
 * So for M88 phy's, this function interprets the one value returned from the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6673
 * register to the minimum and maximum range.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6674
 * For IGP phy's, the function calculates the range by the AGC registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6675
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6676
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6677
e1000_get_cable_length(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6678
                       uint16_t *min_length,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6679
                       uint16_t *max_length)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6680
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6681
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6682
    uint16_t agc_value = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6683
    uint16_t i, phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6684
    uint16_t cable_length;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6685
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6686
    DEBUGFUNC("e1000_get_cable_length");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6687
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6688
    *min_length = *max_length = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6689
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6690
    /* Use old method for Phy older than IGP */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6691
    if (hw->phy_type == e1000_phy_m88) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6692
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6693
        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6694
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6695
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6696
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6697
        cable_length = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6698
                       M88E1000_PSSR_CABLE_LENGTH_SHIFT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6699
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6700
        /* Convert the enum value to ranged values */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6701
        switch (cable_length) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6702
        case e1000_cable_length_50:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6703
            *min_length = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6704
            *max_length = e1000_igp_cable_length_50;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6705
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6706
        case e1000_cable_length_50_80:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6707
            *min_length = e1000_igp_cable_length_50;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6708
            *max_length = e1000_igp_cable_length_80;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6709
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6710
        case e1000_cable_length_80_110:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6711
            *min_length = e1000_igp_cable_length_80;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6712
            *max_length = e1000_igp_cable_length_110;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6713
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6714
        case e1000_cable_length_110_140:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6715
            *min_length = e1000_igp_cable_length_110;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6716
            *max_length = e1000_igp_cable_length_140;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6717
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6718
        case e1000_cable_length_140:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6719
            *min_length = e1000_igp_cable_length_140;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6720
            *max_length = e1000_igp_cable_length_170;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6721
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6722
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6723
            return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6724
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6725
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6726
    } else if (hw->phy_type == e1000_phy_gg82563) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6727
        ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6728
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6729
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6730
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6731
        cable_length = phy_data & GG82563_DSPD_CABLE_LENGTH;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6732
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6733
        switch (cable_length) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6734
        case e1000_gg_cable_length_60:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6735
            *min_length = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6736
            *max_length = e1000_igp_cable_length_60;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6737
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6738
        case e1000_gg_cable_length_60_115:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6739
            *min_length = e1000_igp_cable_length_60;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6740
            *max_length = e1000_igp_cable_length_115;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6741
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6742
        case e1000_gg_cable_length_115_150:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6743
            *min_length = e1000_igp_cable_length_115;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6744
            *max_length = e1000_igp_cable_length_150;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6745
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6746
        case e1000_gg_cable_length_150:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6747
            *min_length = e1000_igp_cable_length_150;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6748
            *max_length = e1000_igp_cable_length_180;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6749
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6750
        default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6751
            return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6752
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6753
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6754
    } else if (hw->phy_type == e1000_phy_igp) { /* For IGP PHY */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6755
        uint16_t cur_agc_value;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6756
        uint16_t min_agc_value = IGP01E1000_AGC_LENGTH_TABLE_SIZE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6757
        uint16_t agc_reg_array[IGP01E1000_PHY_CHANNEL_NUM] =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6758
                                                         {IGP01E1000_PHY_AGC_A,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6759
                                                          IGP01E1000_PHY_AGC_B,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6760
                                                          IGP01E1000_PHY_AGC_C,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6761
                                                          IGP01E1000_PHY_AGC_D};
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6762
        /* Read the AGC registers for all channels */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6763
        for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6764
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6765
            ret_val = e1000_read_phy_reg(hw, agc_reg_array[i], &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6766
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6767
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6768
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6769
            cur_agc_value = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6770
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6771
            /* Value bound check. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6772
            if ((cur_agc_value >= IGP01E1000_AGC_LENGTH_TABLE_SIZE - 1) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6773
                (cur_agc_value == 0))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6774
                return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6775
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6776
            agc_value += cur_agc_value;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6777
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6778
            /* Update minimal AGC value. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6779
            if (min_agc_value > cur_agc_value)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6780
                min_agc_value = cur_agc_value;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6781
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6782
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6783
        /* Remove the minimal AGC result for length < 50m */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6784
        if (agc_value < IGP01E1000_PHY_CHANNEL_NUM * e1000_igp_cable_length_50) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6785
            agc_value -= min_agc_value;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6786
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6787
            /* Get the average length of the remaining 3 channels */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6788
            agc_value /= (IGP01E1000_PHY_CHANNEL_NUM - 1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6789
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6790
            /* Get the average length of all the 4 channels. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6791
            agc_value /= IGP01E1000_PHY_CHANNEL_NUM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6792
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6793
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6794
        /* Set the range of the calculated length. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6795
        *min_length = ((e1000_igp_cable_length_table[agc_value] -
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6796
                       IGP01E1000_AGC_RANGE) > 0) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6797
                       (e1000_igp_cable_length_table[agc_value] -
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6798
                       IGP01E1000_AGC_RANGE) : 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6799
        *max_length = e1000_igp_cable_length_table[agc_value] +
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6800
                      IGP01E1000_AGC_RANGE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6801
    } else if (hw->phy_type == e1000_phy_igp_2 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6802
               hw->phy_type == e1000_phy_igp_3) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6803
        uint16_t cur_agc_index, max_agc_index = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6804
        uint16_t min_agc_index = IGP02E1000_AGC_LENGTH_TABLE_SIZE - 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6805
        uint16_t agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6806
                                                         {IGP02E1000_PHY_AGC_A,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6807
                                                          IGP02E1000_PHY_AGC_B,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6808
                                                          IGP02E1000_PHY_AGC_C,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6809
                                                          IGP02E1000_PHY_AGC_D};
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6810
        /* Read the AGC registers for all channels */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6811
        for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6812
            ret_val = e1000_read_phy_reg(hw, agc_reg_array[i], &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6813
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6814
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6815
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6816
            /* Getting bits 15:9, which represent the combination of course and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6817
             * fine gain values.  The result is a number that can be put into
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6818
             * the lookup table to obtain the approximate cable length. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6819
            cur_agc_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) &
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6820
                            IGP02E1000_AGC_LENGTH_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6821
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6822
            /* Array index bound check. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6823
            if ((cur_agc_index >= IGP02E1000_AGC_LENGTH_TABLE_SIZE) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6824
                (cur_agc_index == 0))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6825
                return -E1000_ERR_PHY;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6826
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6827
            /* Remove min & max AGC values from calculation. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6828
            if (e1000_igp_2_cable_length_table[min_agc_index] >
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6829
                e1000_igp_2_cable_length_table[cur_agc_index])
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6830
                min_agc_index = cur_agc_index;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6831
            if (e1000_igp_2_cable_length_table[max_agc_index] <
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6832
                e1000_igp_2_cable_length_table[cur_agc_index])
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6833
                max_agc_index = cur_agc_index;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6834
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6835
            agc_value += e1000_igp_2_cable_length_table[cur_agc_index];
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6836
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6837
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6838
        agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] +
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6839
                      e1000_igp_2_cable_length_table[max_agc_index]);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6840
        agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6841
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6842
        /* Calculate cable length with the error range of +/- 10 meters. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6843
        *min_length = ((agc_value - IGP02E1000_AGC_RANGE) > 0) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6844
                       (agc_value - IGP02E1000_AGC_RANGE) : 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6845
        *max_length = agc_value + IGP02E1000_AGC_RANGE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6846
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6847
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6848
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6849
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6850
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6851
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6852
 * Check the cable polarity
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6853
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6854
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6855
 * polarity - output parameter : 0 - Polarity is not reversed
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6856
 *                               1 - Polarity is reversed.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6857
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6858
 * returns: - E1000_ERR_XXX
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6859
 *            E1000_SUCCESS
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6860
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6861
 * For phy's older then IGP, this function simply reads the polarity bit in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6862
 * Phy Status register.  For IGP phy's, this bit is valid only if link speed is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6863
 * 10 Mbps.  If the link speed is 100 Mbps there is no polarity so this bit will
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6864
 * return 0.  If the link speed is 1000 Mbps the polarity status is in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6865
 * IGP01E1000_PHY_PCS_INIT_REG.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6866
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6867
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6868
e1000_check_polarity(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6869
                     e1000_rev_polarity *polarity)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6870
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6871
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6872
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6873
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6874
    DEBUGFUNC("e1000_check_polarity");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6875
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6876
    if ((hw->phy_type == e1000_phy_m88) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6877
        (hw->phy_type == e1000_phy_gg82563)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6878
        /* return the Polarity bit in the Status register. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6879
        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6880
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6881
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6882
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6883
        *polarity = ((phy_data & M88E1000_PSSR_REV_POLARITY) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6884
                     M88E1000_PSSR_REV_POLARITY_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6885
                     e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6886
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6887
    } else if (hw->phy_type == e1000_phy_igp ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6888
              hw->phy_type == e1000_phy_igp_3 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6889
              hw->phy_type == e1000_phy_igp_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6890
        /* Read the Status register to check the speed */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6891
        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6892
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6893
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6894
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6895
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6896
        /* If speed is 1000 Mbps, must read the IGP01E1000_PHY_PCS_INIT_REG to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6897
         * find the polarity status */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6898
        if ((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6899
           IGP01E1000_PSSR_SPEED_1000MBPS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6900
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6901
            /* Read the GIG initialization PCS register (0x00B4) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6902
            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PCS_INIT_REG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6903
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6904
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6905
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6906
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6907
            /* Check the polarity bits */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6908
            *polarity = (phy_data & IGP01E1000_PHY_POLARITY_MASK) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6909
                         e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6910
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6911
            /* For 10 Mbps, read the polarity bit in the status register. (for
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6912
             * 100 Mbps this bit is always 0) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6913
            *polarity = (phy_data & IGP01E1000_PSSR_POLARITY_REVERSED) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6914
                         e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6915
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6916
    } else if (hw->phy_type == e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6917
        ret_val = e1000_read_phy_reg(hw, IFE_PHY_EXTENDED_STATUS_CONTROL,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6918
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6919
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6920
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6921
        *polarity = ((phy_data & IFE_PESC_POLARITY_REVERSED) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6922
                     IFE_PESC_POLARITY_REVERSED_SHIFT) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6923
                     e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6924
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6925
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6926
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6927
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6928
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6929
 * Check if Downshift occured
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6930
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6931
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6932
 * downshift - output parameter : 0 - No Downshift ocured.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6933
 *                                1 - Downshift ocured.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6934
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6935
 * returns: - E1000_ERR_XXX
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6936
 *            E1000_SUCCESS
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6937
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6938
 * For phy's older then IGP, this function reads the Downshift bit in the Phy
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6939
 * Specific Status register.  For IGP phy's, it reads the Downgrade bit in the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6940
 * Link Health register.  In IGP this bit is latched high, so the driver must
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6941
 * read it immediately after link is established.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6942
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6943
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6944
e1000_check_downshift(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6945
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6946
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6947
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6948
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6949
    DEBUGFUNC("e1000_check_downshift");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6950
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6951
    if (hw->phy_type == e1000_phy_igp ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6952
        hw->phy_type == e1000_phy_igp_3 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6953
        hw->phy_type == e1000_phy_igp_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6954
        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6955
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6956
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6957
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6958
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6959
        hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6960
    } else if ((hw->phy_type == e1000_phy_m88) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6961
               (hw->phy_type == e1000_phy_gg82563)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6962
        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6963
                                     &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6964
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6965
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6966
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6967
        hw->speed_downgraded = (phy_data & M88E1000_PSSR_DOWNSHIFT) >>
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6968
                               M88E1000_PSSR_DOWNSHIFT_SHIFT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6969
    } else if (hw->phy_type == e1000_phy_ife) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6970
        /* e1000_phy_ife supports 10/100 speed only */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6971
        hw->speed_downgraded = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6972
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6973
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6974
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6975
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6976
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6977
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6978
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6979
 * 82541_rev_2 & 82547_rev_2 have the capability to configure the DSP when a
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6980
 * gigabit link is achieved to improve link quality.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6981
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6982
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6983
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6984
 * returns: - E1000_ERR_PHY if fail to read/write the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6985
 *            E1000_SUCCESS at any other case.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6986
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6987
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6988
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6989
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6990
e1000_config_dsp_after_link_change(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6991
                                   boolean_t link_up)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6992
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6993
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6994
    uint16_t phy_data, phy_saved_data, speed, duplex, i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6995
    uint16_t dsp_reg_array[IGP01E1000_PHY_CHANNEL_NUM] =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6996
                                        {IGP01E1000_PHY_AGC_PARAM_A,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6997
                                        IGP01E1000_PHY_AGC_PARAM_B,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6998
                                        IGP01E1000_PHY_AGC_PARAM_C,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6999
                                        IGP01E1000_PHY_AGC_PARAM_D};
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7000
    uint16_t min_length, max_length;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7001
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7002
    DEBUGFUNC("e1000_config_dsp_after_link_change");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7003
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7004
    if (hw->phy_type != e1000_phy_igp)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7005
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7006
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7007
    if (link_up) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7008
        ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7009
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7010
            DEBUGOUT("Error getting link speed and duplex\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7011
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7012
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7013
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7014
        if (speed == SPEED_1000) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7015
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7016
            ret_val = e1000_get_cable_length(hw, &min_length, &max_length);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7017
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7018
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7019
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7020
            if ((hw->dsp_config_state == e1000_dsp_config_enabled) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7021
                min_length >= e1000_igp_cable_length_50) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7022
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7023
                for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7024
                    ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i],
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7025
                                                 &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7026
                    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7027
                        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7028
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7029
                    phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7030
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7031
                    ret_val = e1000_write_phy_reg(hw, dsp_reg_array[i],
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7032
                                                  phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7033
                    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7034
                        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7035
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7036
                hw->dsp_config_state = e1000_dsp_config_activated;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7037
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7038
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7039
            if ((hw->ffe_config_state == e1000_ffe_config_enabled) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7040
               (min_length < e1000_igp_cable_length_50)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7041
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7042
                uint16_t ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_20;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7043
                uint32_t idle_errs = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7044
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7045
                /* clear previous idle error counts */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7046
                ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7047
                                             &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7048
                if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7049
                    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7050
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7051
                for (i = 0; i < ffe_idle_err_timeout; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7052
                    udelay(1000);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7053
                    ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7054
                                                 &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7055
                    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7056
                        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7057
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7058
                    idle_errs += (phy_data & SR_1000T_IDLE_ERROR_CNT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7059
                    if (idle_errs > SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7060
                        hw->ffe_config_state = e1000_ffe_config_active;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7061
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7062
                        ret_val = e1000_write_phy_reg(hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7063
                                    IGP01E1000_PHY_DSP_FFE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7064
                                    IGP01E1000_PHY_DSP_FFE_CM_CP);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7065
                        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7066
                            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7067
                        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7068
                    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7069
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7070
                    if (idle_errs)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7071
                        ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_100;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7072
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7073
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7074
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7075
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7076
        if (hw->dsp_config_state == e1000_dsp_config_activated) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7077
            /* Save off the current value of register 0x2F5B to be restored at
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7078
             * the end of the routines. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7079
            ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7080
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7081
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7082
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7083
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7084
            /* Disable the PHY transmitter */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7085
            ret_val = e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7086
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7087
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7088
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7089
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7090
            mdelay(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7091
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7092
            ret_val = e1000_write_phy_reg(hw, 0x0000,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7093
                                          IGP01E1000_IEEE_FORCE_GIGA);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7094
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7095
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7096
            for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7097
                ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i], &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7098
                if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7099
                    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7100
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7101
                phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7102
                phy_data |=  IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7103
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7104
                ret_val = e1000_write_phy_reg(hw,dsp_reg_array[i], phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7105
                if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7106
                    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7107
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7108
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7109
            ret_val = e1000_write_phy_reg(hw, 0x0000,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7110
                                          IGP01E1000_IEEE_RESTART_AUTONEG);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7111
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7112
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7113
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7114
            mdelay(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7115
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7116
            /* Now enable the transmitter */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7117
            ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7118
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7119
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7120
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7121
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7122
            hw->dsp_config_state = e1000_dsp_config_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7123
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7124
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7125
        if (hw->ffe_config_state == e1000_ffe_config_active) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7126
            /* Save off the current value of register 0x2F5B to be restored at
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7127
             * the end of the routines. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7128
            ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7129
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7130
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7131
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7132
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7133
            /* Disable the PHY transmitter */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7134
            ret_val = e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7135
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7136
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7137
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7138
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7139
            mdelay(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7140
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7141
            ret_val = e1000_write_phy_reg(hw, 0x0000,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7142
                                          IGP01E1000_IEEE_FORCE_GIGA);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7143
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7144
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7145
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_DSP_FFE,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7146
                                          IGP01E1000_PHY_DSP_FFE_DEFAULT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7147
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7148
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7149
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7150
            ret_val = e1000_write_phy_reg(hw, 0x0000,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7151
                                          IGP01E1000_IEEE_RESTART_AUTONEG);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7152
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7153
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7154
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7155
            mdelay(20);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7156
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7157
            /* Now enable the transmitter */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7158
            ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7159
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7160
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7161
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7162
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7163
            hw->ffe_config_state = e1000_ffe_config_enabled;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7164
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7165
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7166
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7167
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7168
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7169
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7170
 * Set PHY to class A mode
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7171
 * Assumes the following operations will follow to enable the new class mode.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7172
 *  1. Do a PHY soft reset
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7173
 *  2. Restart auto-negotiation or force link.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7174
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7175
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7176
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7177
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7178
e1000_set_phy_mode(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7179
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7180
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7181
    uint16_t eeprom_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7182
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7183
    DEBUGFUNC("e1000_set_phy_mode");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7184
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7185
    if ((hw->mac_type == e1000_82545_rev_3) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7186
        (hw->media_type == e1000_media_type_copper)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7187
        ret_val = e1000_read_eeprom(hw, EEPROM_PHY_CLASS_WORD, 1, &eeprom_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7188
        if (ret_val) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7189
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7190
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7191
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7192
        if ((eeprom_data != EEPROM_RESERVED_WORD) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7193
            (eeprom_data & EEPROM_PHY_CLASS_A)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7194
            ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x000B);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7195
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7196
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7197
            ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0x8104);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7198
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7199
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7200
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7201
            hw->phy_reset_disable = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7202
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7203
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7204
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7205
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7206
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7207
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7208
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7209
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7210
 * This function sets the lplu state according to the active flag.  When
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7211
 * activating lplu this function also disables smart speed and vise versa.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7212
 * lplu will not be activated unless the device autonegotiation advertisment
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7213
 * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7214
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7215
 * active - true to enable lplu false to disable lplu.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7216
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7217
 * returns: - E1000_ERR_PHY if fail to read/write the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7218
 *            E1000_SUCCESS at any other case.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7219
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7220
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7221
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7222
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7223
e1000_set_d3_lplu_state(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7224
                        boolean_t active)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7225
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7226
    uint32_t phy_ctrl = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7227
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7228
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7229
    DEBUGFUNC("e1000_set_d3_lplu_state");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7230
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7231
    if (hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7232
        && hw->phy_type != e1000_phy_igp_3)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7233
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7234
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7235
    /* During driver activity LPLU should not be used or it will attain link
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7236
     * from the lowest speeds starting from 10Mbps. The capability is used for
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7237
     * Dx transitions and states */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7238
    if (hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7239
        ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7240
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7241
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7242
    } else if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7243
        /* MAC writes into PHY register based on the state transition
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7244
         * and start auto-negotiation. SW driver can overwrite the settings
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7245
         * in CSR PHY power control E1000_PHY_CTRL register. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7246
        phy_ctrl = E1000_READ_REG(hw, PHY_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7247
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7248
        ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7249
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7250
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7251
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7252
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7253
    if (!active) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7254
        if (hw->mac_type == e1000_82541_rev_2 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7255
            hw->mac_type == e1000_82547_rev_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7256
            phy_data &= ~IGP01E1000_GMII_FLEX_SPD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7257
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7258
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7259
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7260
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7261
            if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7262
                phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7263
                E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7264
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7265
                phy_data &= ~IGP02E1000_PM_D3_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7266
                ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7267
                                              phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7268
                if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7269
                    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7270
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7271
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7272
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7273
        /* LPLU and SmartSpeed are mutually exclusive.  LPLU is used during
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7274
         * Dx states where the power conservation is most important.  During
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7275
         * driver activity we should enable SmartSpeed, so performance is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7276
         * maintained. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7277
        if (hw->smart_speed == e1000_smart_speed_on) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7278
            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7279
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7280
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7281
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7282
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7283
            phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7284
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7285
                                          phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7286
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7287
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7288
        } else if (hw->smart_speed == e1000_smart_speed_off) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7289
            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7290
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7291
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7292
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7293
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7294
            phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7295
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7296
                                          phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7297
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7298
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7299
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7300
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7301
    } else if ((hw->autoneg_advertised == AUTONEG_ADVERTISE_SPEED_DEFAULT) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7302
               (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL ) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7303
               (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7304
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7305
        if (hw->mac_type == e1000_82541_rev_2 ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7306
            hw->mac_type == e1000_82547_rev_2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7307
            phy_data |= IGP01E1000_GMII_FLEX_SPD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7308
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7309
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7310
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7311
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7312
            if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7313
                phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7314
                E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7315
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7316
                phy_data |= IGP02E1000_PM_D3_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7317
                ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7318
                                              phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7319
                if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7320
                    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7321
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7322
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7323
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7324
        /* When LPLU is enabled we should disable SmartSpeed */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7325
        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7326
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7327
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7328
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7329
        phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7330
        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7331
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7332
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7333
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7334
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7335
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7336
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7337
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7338
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7339
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7340
 * This function sets the lplu d0 state according to the active flag.  When
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7341
 * activating lplu this function also disables smart speed and vise versa.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7342
 * lplu will not be activated unless the device autonegotiation advertisment
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7343
 * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7344
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7345
 * active - true to enable lplu false to disable lplu.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7346
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7347
 * returns: - E1000_ERR_PHY if fail to read/write the PHY
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7348
 *            E1000_SUCCESS at any other case.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7349
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7350
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7351
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7352
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7353
e1000_set_d0_lplu_state(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7354
                        boolean_t active)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7355
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7356
    uint32_t phy_ctrl = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7357
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7358
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7359
    DEBUGFUNC("e1000_set_d0_lplu_state");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7360
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7361
    if (hw->mac_type <= e1000_82547_rev_2)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7362
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7363
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7364
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7365
        phy_ctrl = E1000_READ_REG(hw, PHY_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7366
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7367
        ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7368
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7369
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7370
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7371
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7372
    if (!active) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7373
        if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7374
            phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7375
            E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7376
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7377
            phy_data &= ~IGP02E1000_PM_D0_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7378
            ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7379
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7380
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7381
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7382
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7383
        /* LPLU and SmartSpeed are mutually exclusive.  LPLU is used during
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7384
         * Dx states where the power conservation is most important.  During
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7385
         * driver activity we should enable SmartSpeed, so performance is
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7386
         * maintained. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7387
        if (hw->smart_speed == e1000_smart_speed_on) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7388
            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7389
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7390
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7391
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7392
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7393
            phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7394
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7395
                                          phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7396
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7397
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7398
        } else if (hw->smart_speed == e1000_smart_speed_off) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7399
            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7400
                                         &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7401
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7402
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7403
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7404
            phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7405
            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7406
                                          phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7407
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7408
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7409
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7410
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7411
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7412
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7413
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7414
        if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7415
            phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7416
            E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7417
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7418
            phy_data |= IGP02E1000_PM_D0_LPLU;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7419
            ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7420
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7421
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7422
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7423
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7424
        /* When LPLU is enabled we should disable SmartSpeed */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7425
        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7426
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7427
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7428
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7429
        phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7430
        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7431
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7432
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7433
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7434
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7435
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7436
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7437
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7438
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7439
 * Change VCO speed register to improve Bit Error Rate performance of SERDES.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7440
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7441
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7442
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7443
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7444
e1000_set_vco_speed(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7445
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7446
    int32_t  ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7447
    uint16_t default_page = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7448
    uint16_t phy_data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7449
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7450
    DEBUGFUNC("e1000_set_vco_speed");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7451
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7452
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7453
    case e1000_82545_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7454
    case e1000_82546_rev_3:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7455
       break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7456
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7457
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7458
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7459
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7460
    /* Set PHY register 30, page 5, bit 8 to 0 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7461
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7462
    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, &default_page);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7463
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7464
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7465
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7466
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7467
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7468
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7469
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7470
    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7471
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7472
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7473
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7474
    phy_data &= ~M88E1000_PHY_VCO_REG_BIT8;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7475
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7476
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7477
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7478
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7479
    /* Set PHY register 30, page 4, bit 11 to 1 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7480
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7481
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0004);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7482
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7483
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7484
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7485
    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7486
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7487
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7488
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7489
    phy_data |= M88E1000_PHY_VCO_REG_BIT11;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7490
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7491
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7492
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7493
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7494
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, default_page);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7495
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7496
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7497
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7498
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7499
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7500
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7501
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7502
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7503
 * This function reads the cookie from ARC ram.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7504
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7505
 * returns: - E1000_SUCCESS .
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7506
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7507
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7508
e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7509
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7510
    uint8_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7511
    uint32_t offset = E1000_MNG_DHCP_COOKIE_OFFSET;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7512
    uint8_t length = E1000_MNG_DHCP_COOKIE_LENGTH;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7513
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7514
    length = (length >> 2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7515
    offset = (offset >> 2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7516
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7517
    for (i = 0; i < length; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7518
        *((uint32_t *) buffer + i) =
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7519
            E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset + i);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7520
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7521
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7522
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7523
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7524
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7525
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7526
 * This function checks whether the HOST IF is enabled for command operaton
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7527
 * and also checks whether the previous command is completed.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7528
 * It busy waits in case of previous command is not completed.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7529
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7530
 * returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7531
 *            timeout
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7532
 *          - E1000_SUCCESS for success.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7533
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7534
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7535
e1000_mng_enable_host_if(struct e1000_hw * hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7536
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7537
    uint32_t hicr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7538
    uint8_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7539
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7540
    /* Check that the host interface is enabled. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7541
    hicr = E1000_READ_REG(hw, HICR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7542
    if ((hicr & E1000_HICR_EN) == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7543
        DEBUGOUT("E1000_HOST_EN bit disabled.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7544
        return -E1000_ERR_HOST_INTERFACE_COMMAND;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7545
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7546
    /* check the previous command is completed */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7547
    for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7548
        hicr = E1000_READ_REG(hw, HICR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7549
        if (!(hicr & E1000_HICR_C))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7550
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7551
        mdelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7552
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7553
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7554
    if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7555
        DEBUGOUT("Previous command timeout failed .\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7556
        return -E1000_ERR_HOST_INTERFACE_COMMAND;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7557
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7558
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7559
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7560
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7561
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7562
 * This function writes the buffer content at the offset given on the host if.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7563
 * It also does alignment considerations to do the writes in most efficient way.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7564
 * Also fills up the sum of the buffer in *buffer parameter.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7565
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7566
 * returns  - E1000_SUCCESS for success.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7567
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7568
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7569
e1000_mng_host_if_write(struct e1000_hw * hw, uint8_t *buffer,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7570
                        uint16_t length, uint16_t offset, uint8_t *sum)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7571
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7572
    uint8_t *tmp;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7573
    uint8_t *bufptr = buffer;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7574
    uint32_t data = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7575
    uint16_t remaining, i, j, prev_bytes;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7576
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7577
    /* sum = only sum of the data and it is not checksum */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7578
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7579
    if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7580
        return -E1000_ERR_PARAM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7581
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7582
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7583
    tmp = (uint8_t *)&data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7584
    prev_bytes = offset & 0x3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7585
    offset &= 0xFFFC;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7586
    offset >>= 2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7587
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7588
    if (prev_bytes) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7589
        data = E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7590
        for (j = prev_bytes; j < sizeof(uint32_t); j++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7591
            *(tmp + j) = *bufptr++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7592
            *sum += *(tmp + j);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7593
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7594
        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7595
        length -= j - prev_bytes;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7596
        offset++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7597
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7598
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7599
    remaining = length & 0x3;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7600
    length -= remaining;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7601
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7602
    /* Calculate length in DWORDs */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7603
    length >>= 2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7604
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7605
    /* The device driver writes the relevant command block into the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7606
     * ram area. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7607
    for (i = 0; i < length; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7608
        for (j = 0; j < sizeof(uint32_t); j++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7609
            *(tmp + j) = *bufptr++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7610
            *sum += *(tmp + j);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7611
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7612
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7613
        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7614
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7615
    if (remaining) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7616
        for (j = 0; j < sizeof(uint32_t); j++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7617
            if (j < remaining)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7618
                *(tmp + j) = *bufptr++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7619
            else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7620
                *(tmp + j) = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7621
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7622
            *sum += *(tmp + j);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7623
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7624
        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7625
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7626
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7627
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7628
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7629
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7630
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7631
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7632
 * This function writes the command header after does the checksum calculation.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7633
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7634
 * returns  - E1000_SUCCESS for success.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7635
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7636
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7637
e1000_mng_write_cmd_header(struct e1000_hw * hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7638
                           struct e1000_host_mng_command_header * hdr)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7639
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7640
    uint16_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7641
    uint8_t sum;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7642
    uint8_t *buffer;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7643
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7644
    /* Write the whole command header structure which includes sum of
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7645
     * the buffer */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7646
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7647
    uint16_t length = sizeof(struct e1000_host_mng_command_header);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7648
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7649
    sum = hdr->checksum;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7650
    hdr->checksum = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7651
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7652
    buffer = (uint8_t *) hdr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7653
    i = length;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7654
    while (i--)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7655
        sum += buffer[i];
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7656
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7657
    hdr->checksum = 0 - sum;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7658
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7659
    length >>= 2;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7660
    /* The device driver writes the relevant command block into the ram area. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7661
    for (i = 0; i < length; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7662
        E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, i, *((uint32_t *) hdr + i));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7663
        E1000_WRITE_FLUSH(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7664
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7665
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7666
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7667
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7668
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7669
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7670
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7671
 * This function indicates to ARC that a new command is pending which completes
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7672
 * one write operation by the driver.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7673
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7674
 * returns  - E1000_SUCCESS for success.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7675
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7676
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7677
e1000_mng_write_commit(struct e1000_hw * hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7678
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7679
    uint32_t hicr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7680
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7681
    hicr = E1000_READ_REG(hw, HICR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7682
    /* Setting this bit tells the ARC that a new command is pending. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7683
    E1000_WRITE_REG(hw, HICR, hicr | E1000_HICR_C);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7684
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7685
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7686
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7687
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7688
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7689
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7690
 * This function checks the mode of the firmware.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7691
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7692
 * returns  - TRUE when the mode is IAMT or FALSE.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7693
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7694
boolean_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7695
e1000_check_mng_mode(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7696
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7697
    uint32_t fwsm;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7698
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7699
    fwsm = E1000_READ_REG(hw, FWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7700
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7701
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7702
        if ((fwsm & E1000_FWSM_MODE_MASK) ==
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7703
            (E1000_MNG_ICH_IAMT_MODE << E1000_FWSM_MODE_SHIFT))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7704
            return TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7705
    } else if ((fwsm & E1000_FWSM_MODE_MASK) ==
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7706
               (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7707
        return TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7708
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7709
    return FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7710
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7711
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7712
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7713
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7714
 * This function writes the dhcp info .
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7715
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7716
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7717
e1000_mng_write_dhcp_info(struct e1000_hw * hw, uint8_t *buffer,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7718
                          uint16_t length)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7719
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7720
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7721
    struct e1000_host_mng_command_header hdr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7722
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7723
    hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7724
    hdr.command_length = length;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7725
    hdr.reserved1 = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7726
    hdr.reserved2 = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7727
    hdr.checksum = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7728
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7729
    ret_val = e1000_mng_enable_host_if(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7730
    if (ret_val == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7731
        ret_val = e1000_mng_host_if_write(hw, buffer, length, sizeof(hdr),
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7732
                                          &(hdr.checksum));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7733
        if (ret_val == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7734
            ret_val = e1000_mng_write_cmd_header(hw, &hdr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7735
            if (ret_val == E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7736
                ret_val = e1000_mng_write_commit(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7737
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7738
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7739
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7740
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7741
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7742
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7743
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7744
 * This function calculates the checksum.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7745
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7746
 * returns  - checksum of buffer contents.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7747
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7748
static uint8_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7749
e1000_calculate_mng_checksum(char *buffer, uint32_t length)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7750
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7751
    uint8_t sum = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7752
    uint32_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7753
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7754
    if (!buffer)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7755
        return 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7756
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7757
    for (i=0; i < length; i++)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7758
        sum += buffer[i];
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7759
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7760
    return (uint8_t) (0 - sum);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7761
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7762
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7763
/*****************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7764
 * This function checks whether tx pkt filtering needs to be enabled or not.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7765
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7766
 * returns  - TRUE for packet filtering or FALSE.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7767
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7768
boolean_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7769
e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7770
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7771
    /* called in init as well as watchdog timer functions */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7772
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7773
    int32_t ret_val, checksum;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7774
    boolean_t tx_filter = FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7775
    struct e1000_host_mng_dhcp_cookie *hdr = &(hw->mng_cookie);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7776
    uint8_t *buffer = (uint8_t *) &(hw->mng_cookie);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7777
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7778
    if (e1000_check_mng_mode(hw)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7779
        ret_val = e1000_mng_enable_host_if(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7780
        if (ret_val == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7781
            ret_val = e1000_host_if_read_cookie(hw, buffer);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7782
            if (ret_val == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7783
                checksum = hdr->checksum;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7784
                hdr->checksum = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7785
                if ((hdr->signature == E1000_IAMT_SIGNATURE) &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7786
                    checksum == e1000_calculate_mng_checksum((char *)buffer,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7787
                                               E1000_MNG_DHCP_COOKIE_LENGTH)) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7788
                    if (hdr->status &
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7789
                        E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7790
                        tx_filter = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7791
                } else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7792
                    tx_filter = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7793
            } else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7794
                tx_filter = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7795
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7796
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7797
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7798
    hw->tx_pkt_filtering = tx_filter;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7799
    return tx_filter;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7800
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7801
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7802
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7803
 * Verifies the hardware needs to allow ARPs to be processed by the host
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7804
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7805
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7806
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7807
 * returns: - TRUE/FALSE
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7808
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7809
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7810
uint32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7811
e1000_enable_mng_pass_thru(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7812
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7813
    uint32_t manc;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7814
    uint32_t fwsm, factps;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7815
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7816
    if (hw->asf_firmware_present) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7817
        manc = E1000_READ_REG(hw, MANC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7818
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7819
        if (!(manc & E1000_MANC_RCV_TCO_EN) ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7820
            !(manc & E1000_MANC_EN_MAC_ADDR_FILTER))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7821
            return FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7822
        if (e1000_arc_subsystem_valid(hw) == TRUE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7823
            fwsm = E1000_READ_REG(hw, FWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7824
            factps = E1000_READ_REG(hw, FACTPS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7825
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7826
            if ((((fwsm & E1000_FWSM_MODE_MASK) >> E1000_FWSM_MODE_SHIFT) ==
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7827
                   e1000_mng_mode_pt) && !(factps & E1000_FACTPS_MNGCG))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7828
                return TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7829
        } else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7830
            if ((manc & E1000_MANC_SMBUS_EN) && !(manc & E1000_MANC_ASF_EN))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7831
                return TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7832
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7833
    return FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7834
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7835
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7836
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7837
e1000_polarity_reversal_workaround(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7838
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7839
    int32_t ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7840
    uint16_t mii_status_reg;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7841
    uint16_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7842
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7843
    /* Polarity reversal workaround for forced 10F/10H links. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7844
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7845
    /* Disable the transmitter on the PHY */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7846
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7847
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7848
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7849
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7850
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFFF);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7851
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7852
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7853
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7854
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7855
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7856
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7857
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7858
    /* This loop will early-out if the NO link condition has been met. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7859
    for (i = PHY_FORCE_TIME; i > 0; i--) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7860
        /* Read the MII Status Register and wait for Link Status bit
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7861
         * to be clear.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7862
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7863
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7864
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7865
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7866
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7867
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7868
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7869
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7870
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7871
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7872
        if ((mii_status_reg & ~MII_SR_LINK_STATUS) == 0) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7873
        mdelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7874
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7875
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7876
    /* Recommended delay time after link has been lost */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7877
    mdelay(1000);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7878
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7879
    /* Now we will re-enable th transmitter on the PHY */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7880
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7881
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7882
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7883
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7884
    mdelay(50);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7885
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFF0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7886
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7887
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7888
    mdelay(50);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7889
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFF00);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7890
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7891
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7892
    mdelay(50);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7893
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0x0000);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7894
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7895
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7896
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7897
    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7898
    if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7899
        return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7900
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7901
    /* This loop will early-out if the link condition has been met. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7902
    for (i = PHY_FORCE_TIME; i > 0; i--) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7903
        /* Read the MII Status Register and wait for Link Status bit
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7904
         * to be set.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7905
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7906
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7907
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7908
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7909
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7910
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7911
        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7912
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7913
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7914
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7915
        if (mii_status_reg & MII_SR_LINK_STATUS) break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7916
        mdelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7917
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7918
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7919
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7920
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7921
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7922
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7923
 * Disables PCI-Express master access.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7924
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7925
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7926
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7927
 * returns: - none.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7928
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7929
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7930
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7931
e1000_set_pci_express_master_disable(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7932
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7933
    uint32_t ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7934
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7935
    DEBUGFUNC("e1000_set_pci_express_master_disable");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7936
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7937
    if (hw->bus_type != e1000_bus_type_pci_express)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7938
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7939
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7940
    ctrl = E1000_READ_REG(hw, CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7941
    ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7942
    E1000_WRITE_REG(hw, CTRL, ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7943
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7944
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7945
/*******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7946
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7947
 * Disables PCI-Express master access and verifies there are no pending requests
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7948
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7949
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7950
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7951
 * returns: - E1000_ERR_MASTER_REQUESTS_PENDING if master disable bit hasn't
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7952
 *            caused the master requests to be disabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7953
 *            E1000_SUCCESS master requests disabled.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7954
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7955
 ******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7956
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7957
e1000_disable_pciex_master(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7958
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7959
    int32_t timeout = MASTER_DISABLE_TIMEOUT;   /* 80ms */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7960
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7961
    DEBUGFUNC("e1000_disable_pciex_master");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7962
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7963
    if (hw->bus_type != e1000_bus_type_pci_express)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7964
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7965
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7966
    e1000_set_pci_express_master_disable(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7967
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7968
    while (timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7969
        if (!(E1000_READ_REG(hw, STATUS) & E1000_STATUS_GIO_MASTER_ENABLE))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7970
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7971
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7972
            udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7973
        timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7974
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7975
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7976
    if (!timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7977
        DEBUGOUT("Master requests are pending.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7978
        return -E1000_ERR_MASTER_REQUESTS_PENDING;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7979
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7980
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7981
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7982
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7983
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7984
/*******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7985
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7986
 * Check for EEPROM Auto Read bit done.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7987
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7988
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7989
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7990
 * returns: - E1000_ERR_RESET if fail to reset MAC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7991
 *            E1000_SUCCESS at any other case.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7992
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7993
 ******************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7994
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7995
e1000_get_auto_rd_done(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7996
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7997
    int32_t timeout = AUTO_READ_DONE_TIMEOUT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7998
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  7999
    DEBUGFUNC("e1000_get_auto_rd_done");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8000
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8001
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8002
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8003
        msleep(5);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8004
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8005
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8006
    case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8007
    case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8008
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8009
    case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8010
        while (timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8011
            if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8012
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8013
            else msleep(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8014
            timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8015
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8016
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8017
        if (!timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8018
            DEBUGOUT("Auto read by HW from EEPROM has not completed.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8019
            return -E1000_ERR_RESET;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8020
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8021
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8022
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8023
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8024
    /* PHY configuration from NVM just starts after EECD_AUTO_RD sets to high.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8025
     * Need to wait for PHY configuration completion before accessing NVM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8026
     * and PHY. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8027
    if (hw->mac_type == e1000_82573)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8028
        msleep(25);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8029
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8030
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8031
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8032
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8033
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8034
 * Checks if the PHY configuration is done
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8035
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8036
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8037
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8038
 * returns: - E1000_ERR_RESET if fail to reset MAC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8039
 *            E1000_SUCCESS at any other case.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8040
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8041
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8042
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8043
e1000_get_phy_cfg_done(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8044
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8045
    int32_t timeout = PHY_CFG_TIMEOUT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8046
    uint32_t cfg_mask = E1000_EEPROM_CFG_DONE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8047
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8048
    DEBUGFUNC("e1000_get_phy_cfg_done");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8049
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8050
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8051
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8052
        mdelay(10);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8053
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8054
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8055
        /* Separate *_CFG_DONE_* bit for each port */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8056
        if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8057
            cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8058
        /* Fall Through */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8059
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8060
    case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8061
        while (timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8062
            if (E1000_READ_REG(hw, EEMNGCTL) & cfg_mask)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8063
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8064
            else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8065
                msleep(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8066
            timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8067
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8068
        if (!timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8069
            DEBUGOUT("MNG configuration cycle has not completed.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8070
            return -E1000_ERR_RESET;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8071
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8072
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8073
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8074
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8075
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8076
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8077
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8078
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8079
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8080
 * Using the combination of SMBI and SWESMBI semaphore bits when resetting
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8081
 * adapter or Eeprom access.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8082
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8083
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8084
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8085
 * returns: - E1000_ERR_EEPROM if fail to access EEPROM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8086
 *            E1000_SUCCESS at any other case.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8087
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8088
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8089
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8090
e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8091
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8092
    int32_t timeout;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8093
    uint32_t swsm;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8094
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8095
    DEBUGFUNC("e1000_get_hw_eeprom_semaphore");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8096
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8097
    if (!hw->eeprom_semaphore_present)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8098
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8099
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8100
    if (hw->mac_type == e1000_80003es2lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8101
        /* Get the SW semaphore. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8102
        if (e1000_get_software_semaphore(hw) != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8103
            return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8104
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8105
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8106
    /* Get the FW semaphore. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8107
    timeout = hw->eeprom.word_size + 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8108
    while (timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8109
        swsm = E1000_READ_REG(hw, SWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8110
        swsm |= E1000_SWSM_SWESMBI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8111
        E1000_WRITE_REG(hw, SWSM, swsm);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8112
        /* if we managed to set the bit we got the semaphore. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8113
        swsm = E1000_READ_REG(hw, SWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8114
        if (swsm & E1000_SWSM_SWESMBI)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8115
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8116
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8117
        udelay(50);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8118
        timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8119
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8120
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8121
    if (!timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8122
        /* Release semaphores */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8123
        e1000_put_hw_eeprom_semaphore(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8124
        DEBUGOUT("Driver can't access the Eeprom - SWESMBI bit is set.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8125
        return -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8126
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8127
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8128
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8129
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8130
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8131
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8132
 * This function clears HW semaphore bits.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8133
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8134
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8135
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8136
 * returns: - None.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8137
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8138
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8139
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8140
e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8141
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8142
    uint32_t swsm;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8143
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8144
    DEBUGFUNC("e1000_put_hw_eeprom_semaphore");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8145
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8146
    if (!hw->eeprom_semaphore_present)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8147
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8148
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8149
    swsm = E1000_READ_REG(hw, SWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8150
    if (hw->mac_type == e1000_80003es2lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8151
        /* Release both semaphores. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8152
        swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8153
    } else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8154
        swsm &= ~(E1000_SWSM_SWESMBI);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8155
    E1000_WRITE_REG(hw, SWSM, swsm);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8156
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8157
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8158
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8159
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8160
 * Obtaining software semaphore bit (SMBI) before resetting PHY.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8161
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8162
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8163
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8164
 * returns: - E1000_ERR_RESET if fail to obtain semaphore.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8165
 *            E1000_SUCCESS at any other case.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8166
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8167
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8168
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8169
e1000_get_software_semaphore(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8170
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8171
    int32_t timeout = hw->eeprom.word_size + 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8172
    uint32_t swsm;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8173
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8174
    DEBUGFUNC("e1000_get_software_semaphore");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8175
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8176
    if (hw->mac_type != e1000_80003es2lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8177
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8178
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8179
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8180
    while (timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8181
        swsm = E1000_READ_REG(hw, SWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8182
        /* If SMBI bit cleared, it is now set and we hold the semaphore */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8183
        if (!(swsm & E1000_SWSM_SMBI))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8184
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8185
        mdelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8186
        timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8187
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8188
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8189
    if (!timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8190
        DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8191
        return -E1000_ERR_RESET;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8192
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8193
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8194
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8195
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8196
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8197
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8198
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8199
 * Release semaphore bit (SMBI).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8200
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8201
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8202
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8203
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8204
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8205
e1000_release_software_semaphore(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8206
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8207
    uint32_t swsm;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8208
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8209
    DEBUGFUNC("e1000_release_software_semaphore");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8210
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8211
    if (hw->mac_type != e1000_80003es2lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8212
        return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8213
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8214
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8215
    swsm = E1000_READ_REG(hw, SWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8216
    /* Release the SW semaphores.*/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8217
    swsm &= ~E1000_SWSM_SMBI;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8218
    E1000_WRITE_REG(hw, SWSM, swsm);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8219
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8220
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8221
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8222
 * Checks if PHY reset is blocked due to SOL/IDER session, for example.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8223
 * Returning E1000_BLK_PHY_RESET isn't necessarily an error.  But it's up to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8224
 * the caller to figure out how to deal with it.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8225
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8226
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8227
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8228
 * returns: - E1000_BLK_PHY_RESET
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8229
 *            E1000_SUCCESS
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8230
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8231
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8232
int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8233
e1000_check_phy_reset_block(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8234
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8235
    uint32_t manc = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8236
    uint32_t fwsm = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8237
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8238
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8239
        fwsm = E1000_READ_REG(hw, FWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8240
        return (fwsm & E1000_FWSM_RSPCIPHY) ? E1000_SUCCESS
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8241
                                            : E1000_BLK_PHY_RESET;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8242
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8243
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8244
    if (hw->mac_type > e1000_82547_rev_2)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8245
        manc = E1000_READ_REG(hw, MANC);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8246
    return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ?
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8247
        E1000_BLK_PHY_RESET : E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8248
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8249
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8250
static uint8_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8251
e1000_arc_subsystem_valid(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8252
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8253
    uint32_t fwsm;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8254
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8255
    /* On 8257x silicon, registers in the range of 0x8800 - 0x8FFC
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8256
     * may not be provided a DMA clock when no manageability features are
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8257
     * enabled.  We do not want to perform any reads/writes to these registers
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8258
     * if this is the case.  We read FWSM to determine the manageability mode.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8259
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8260
    switch (hw->mac_type) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8261
    case e1000_82571:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8262
    case e1000_82572:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8263
    case e1000_82573:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8264
    case e1000_80003es2lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8265
        fwsm = E1000_READ_REG(hw, FWSM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8266
        if ((fwsm & E1000_FWSM_MODE_MASK) != 0)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8267
            return TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8268
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8269
    case e1000_ich8lan:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8270
        return TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8271
    default:
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8272
        break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8273
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8274
    return FALSE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8275
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8276
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8277
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8278
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8279
 * Configure PCI-Ex no-snoop
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8280
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8281
 * hw - Struct containing variables accessed by shared code.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8282
 * no_snoop - Bitmap of no-snoop events.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8283
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8284
 * returns: E1000_SUCCESS
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8285
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8286
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8287
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8288
e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, uint32_t no_snoop)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8289
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8290
    uint32_t gcr_reg = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8291
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8292
    DEBUGFUNC("e1000_set_pci_ex_no_snoop");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8293
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8294
    if (hw->bus_type == e1000_bus_type_unknown)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8295
        e1000_get_bus_info(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8296
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8297
    if (hw->bus_type != e1000_bus_type_pci_express)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8298
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8299
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8300
    if (no_snoop) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8301
        gcr_reg = E1000_READ_REG(hw, GCR);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8302
        gcr_reg &= ~(PCI_EX_NO_SNOOP_ALL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8303
        gcr_reg |= no_snoop;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8304
        E1000_WRITE_REG(hw, GCR, gcr_reg);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8305
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8306
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8307
        uint32_t ctrl_ext;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8308
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8309
        E1000_WRITE_REG(hw, GCR, PCI_EX_82566_SNOOP_ALL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8310
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8311
        ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8312
        ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8313
        E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8314
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8315
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8316
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8317
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8318
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8319
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8320
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8321
 * Get software semaphore FLAG bit (SWFLAG).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8322
 * SWFLAG is used to synchronize the access to all shared resource between
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8323
 * SW, FW and HW.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8324
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8325
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8326
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8327
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8328
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8329
e1000_get_software_flag(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8330
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8331
    int32_t timeout = PHY_CFG_TIMEOUT;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8332
    uint32_t extcnf_ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8333
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8334
    DEBUGFUNC("e1000_get_software_flag");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8335
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8336
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8337
        while (timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8338
            extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8339
            extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8340
            E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8341
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8342
            extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8343
            if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8344
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8345
            mdelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8346
            timeout--;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8347
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8348
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8349
        if (!timeout) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8350
            DEBUGOUT("FW or HW locks the resource too long.\n");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8351
            return -E1000_ERR_CONFIG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8352
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8353
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8354
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8355
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8356
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8357
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8358
/***************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8359
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8360
 * Release software semaphore FLAG bit (SWFLAG).
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8361
 * SWFLAG is used to synchronize the access to all shared resource between
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8362
 * SW, FW and HW.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8363
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8364
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8365
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8366
 ***************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8367
static void
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8368
e1000_release_software_flag(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8369
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8370
    uint32_t extcnf_ctrl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8371
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8372
    DEBUGFUNC("e1000_release_software_flag");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8373
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8374
    if (hw->mac_type == e1000_ich8lan) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8375
        extcnf_ctrl= E1000_READ_REG(hw, EXTCNF_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8376
        extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8377
        E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8378
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8379
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8380
    return;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8381
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8382
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8383
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8384
 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8385
 * register.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8386
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8387
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8388
 * offset - offset of word in the EEPROM to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8389
 * data - word read from the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8390
 * words - number of words to read
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8391
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8392
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8393
e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8394
                       uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8395
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8396
    int32_t  error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8397
    uint32_t flash_bank = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8398
    uint32_t act_offset = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8399
    uint32_t bank_offset = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8400
    uint16_t word = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8401
    uint16_t i = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8402
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8403
    /* We need to know which is the valid flash bank.  In the event
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8404
     * that we didn't allocate eeprom_shadow_ram, we may not be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8405
     * managing flash_bank.  So it cannot be trusted and needs
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8406
     * to be updated with each read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8407
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8408
    /* Value of bit 22 corresponds to the flash bank we're on. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8409
    flash_bank = (E1000_READ_REG(hw, EECD) & E1000_EECD_SEC1VAL) ? 1 : 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8410
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8411
    /* Adjust offset appropriately if we're on bank 1 - adjust for word size */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8412
    bank_offset = flash_bank * (hw->flash_bank_size * 2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8413
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8414
    error = e1000_get_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8415
    if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8416
        return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8417
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8418
    for (i = 0; i < words; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8419
        if (hw->eeprom_shadow_ram != NULL &&
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8420
            hw->eeprom_shadow_ram[offset+i].modified == TRUE) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8421
            data[i] = hw->eeprom_shadow_ram[offset+i].eeprom_word;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8422
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8423
            /* The NVM part needs a byte offset, hence * 2 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8424
            act_offset = bank_offset + ((offset + i) * 2);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8425
            error = e1000_read_ich8_word(hw, act_offset, &word);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8426
            if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8427
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8428
            data[i] = word;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8429
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8430
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8431
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8432
    e1000_release_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8433
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8434
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8435
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8436
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8437
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8438
 * Writes a 16 bit word or words to the EEPROM using the ICH8's flash access
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8439
 * register.  Actually, writes are written to the shadow ram cache in the hw
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8440
 * structure hw->e1000_shadow_ram.  e1000_commit_shadow_ram flushes this to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8441
 * the NVM, which occurs when the NVM checksum is updated.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8442
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8443
 * hw - Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8444
 * offset - offset of word in the EEPROM to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8445
 * words - number of words to write
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8446
 * data - words to write to the EEPROM
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8447
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8448
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8449
e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8450
                        uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8451
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8452
    uint32_t i = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8453
    int32_t error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8454
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8455
    error = e1000_get_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8456
    if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8457
        return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8458
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8459
    /* A driver can write to the NVM only if it has eeprom_shadow_ram
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8460
     * allocated.  Subsequent reads to the modified words are read from
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8461
     * this cached structure as well.  Writes will only go into this
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8462
     * cached structure unless it's followed by a call to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8463
     * e1000_update_eeprom_checksum() where it will commit the changes
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8464
     * and clear the "modified" field.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8465
     */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8466
    if (hw->eeprom_shadow_ram != NULL) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8467
        for (i = 0; i < words; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8468
            if ((offset + i) < E1000_SHADOW_RAM_WORDS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8469
                hw->eeprom_shadow_ram[offset+i].modified = TRUE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8470
                hw->eeprom_shadow_ram[offset+i].eeprom_word = data[i];
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8471
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8472
                error = -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8473
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8474
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8475
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8476
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8477
        /* Drivers have the option to not allocate eeprom_shadow_ram as long
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8478
         * as they don't perform any NVM writes.  An attempt in doing so
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8479
         * will result in this error.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8480
         */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8481
        error = -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8482
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8483
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8484
    e1000_release_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8485
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8486
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8487
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8488
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8489
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8490
 * This function does initial flash setup so that a new read/write/erase cycle
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8491
 * can be started.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8492
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8493
 * hw - The pointer to the hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8494
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8495
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8496
e1000_ich8_cycle_init(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8497
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8498
    union ich8_hws_flash_status hsfsts;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8499
    int32_t error = E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8500
    int32_t i     = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8501
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8502
    DEBUGFUNC("e1000_ich8_cycle_init");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8503
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8504
    hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8505
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8506
    /* May be check the Flash Des Valid bit in Hw status */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8507
    if (hsfsts.hsf_status.fldesvalid == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8508
        DEBUGOUT("Flash descriptor invalid.  SW Sequencing must be used.");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8509
        return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8510
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8511
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8512
    /* Clear FCERR in Hw status by writing 1 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8513
    /* Clear DAEL in Hw status by writing a 1 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8514
    hsfsts.hsf_status.flcerr = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8515
    hsfsts.hsf_status.dael = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8516
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8517
    E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS, hsfsts.regval);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8518
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8519
    /* Either we should have a hardware SPI cycle in progress bit to check
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8520
     * against, in order to start a new cycle or FDONE bit should be changed
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8521
     * in the hardware so that it is 1 after harware reset, which can then be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8522
     * used as an indication whether a cycle is in progress or has been
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8523
     * completed .. we should also have some software semaphore mechanism to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8524
     * guard FDONE or the cycle in progress bit so that two threads access to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8525
     * those bits can be sequentiallized or a way so that 2 threads dont
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8526
     * start the cycle at the same time */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8527
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8528
    if (hsfsts.hsf_status.flcinprog == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8529
        /* There is no cycle running at present, so we can start a cycle */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8530
        /* Begin by setting Flash Cycle Done. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8531
        hsfsts.hsf_status.flcdone = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8532
        E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS, hsfsts.regval);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8533
        error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8534
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8535
        /* otherwise poll for sometime so the current cycle has a chance
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8536
         * to end before giving up. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8537
        for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8538
            hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8539
            if (hsfsts.hsf_status.flcinprog == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8540
                error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8541
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8542
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8543
            udelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8544
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8545
        if (error == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8546
            /* Successful in waiting for previous cycle to timeout,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8547
             * now set the Flash Cycle Done. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8548
            hsfsts.hsf_status.flcdone = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8549
            E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS, hsfsts.regval);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8550
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8551
            DEBUGOUT("Flash controller busy, cannot get access");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8552
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8553
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8554
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8555
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8556
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8557
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8558
 * This function starts a flash cycle and waits for its completion
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8559
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8560
 * hw - The pointer to the hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8561
 ****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8562
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8563
e1000_ich8_flash_cycle(struct e1000_hw *hw, uint32_t timeout)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8564
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8565
    union ich8_hws_flash_ctrl hsflctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8566
    union ich8_hws_flash_status hsfsts;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8567
    int32_t error = E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8568
    uint32_t i = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8569
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8570
    /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8571
    hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8572
    hsflctl.hsf_ctrl.flcgo = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8573
    E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8574
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8575
    /* wait till FDONE bit is set to 1 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8576
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8577
        hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8578
        if (hsfsts.hsf_status.flcdone == 1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8579
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8580
        udelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8581
        i++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8582
    } while (i < timeout);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8583
    if (hsfsts.hsf_status.flcdone == 1 && hsfsts.hsf_status.flcerr == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8584
        error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8585
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8586
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8587
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8588
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8589
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8590
 * Reads a byte or word from the NVM using the ICH8 flash access registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8591
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8592
 * hw - The pointer to the hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8593
 * index - The index of the byte or word to read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8594
 * size - Size of data to read, 1=byte 2=word
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8595
 * data - Pointer to the word to store the value read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8596
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8597
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8598
e1000_read_ich8_data(struct e1000_hw *hw, uint32_t index,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8599
                     uint32_t size, uint16_t* data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8600
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8601
    union ich8_hws_flash_status hsfsts;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8602
    union ich8_hws_flash_ctrl hsflctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8603
    uint32_t flash_linear_address;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8604
    uint32_t flash_data = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8605
    int32_t error = -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8606
    int32_t count = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8607
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8608
    DEBUGFUNC("e1000_read_ich8_data");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8609
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8610
    if (size < 1  || size > 2 || data == NULL ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8611
        index > ICH_FLASH_LINEAR_ADDR_MASK)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8612
        return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8613
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8614
    flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8615
                           hw->flash_base_addr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8616
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8617
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8618
        udelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8619
        /* Steps */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8620
        error = e1000_ich8_cycle_init(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8621
        if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8622
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8623
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8624
        hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8625
        /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8626
        hsflctl.hsf_ctrl.fldbcount = size - 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8627
        hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_READ;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8628
        E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8629
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8630
        /* Write the last 24 bits of index into Flash Linear address field in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8631
         * Flash Address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8632
        /* TODO: TBD maybe check the index against the size of flash */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8633
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8634
        E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FADDR, flash_linear_address);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8635
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8636
        error = e1000_ich8_flash_cycle(hw, ICH_FLASH_COMMAND_TIMEOUT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8637
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8638
        /* Check if FCERR is set to 1, if set to 1, clear it and try the whole
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8639
         * sequence a few more times, else read in (shift in) the Flash Data0,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8640
         * the order is least significant byte first msb to lsb */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8641
        if (error == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8642
            flash_data = E1000_READ_ICH_FLASH_REG(hw, ICH_FLASH_FDATA0);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8643
            if (size == 1) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8644
                *data = (uint8_t)(flash_data & 0x000000FF);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8645
            } else if (size == 2) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8646
                *data = (uint16_t)(flash_data & 0x0000FFFF);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8647
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8648
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8649
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8650
            /* If we've gotten here, then things are probably completely hosed,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8651
             * but if the error condition is detected, it won't hurt to give
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8652
             * it another try...ICH_FLASH_CYCLE_REPEAT_COUNT times.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8653
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8654
            hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8655
            if (hsfsts.hsf_status.flcerr == 1) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8656
                /* Repeat for some time before giving up. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8657
                continue;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8658
            } else if (hsfsts.hsf_status.flcdone == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8659
                DEBUGOUT("Timeout error - flash cycle did not complete.");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8660
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8661
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8662
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8663
    } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8664
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8665
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8666
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8667
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8668
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8669
 * Writes One /two bytes to the NVM using the ICH8 flash access registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8670
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8671
 * hw - The pointer to the hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8672
 * index - The index of the byte/word to read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8673
 * size - Size of data to read, 1=byte 2=word
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8674
 * data - The byte(s) to write to the NVM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8675
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8676
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8677
e1000_write_ich8_data(struct e1000_hw *hw, uint32_t index, uint32_t size,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8678
                      uint16_t data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8679
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8680
    union ich8_hws_flash_status hsfsts;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8681
    union ich8_hws_flash_ctrl hsflctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8682
    uint32_t flash_linear_address;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8683
    uint32_t flash_data = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8684
    int32_t error = -E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8685
    int32_t count = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8686
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8687
    DEBUGFUNC("e1000_write_ich8_data");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8688
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8689
    if (size < 1  || size > 2 || data > size * 0xff ||
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8690
        index > ICH_FLASH_LINEAR_ADDR_MASK)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8691
        return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8692
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8693
    flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8694
                           hw->flash_base_addr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8695
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8696
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8697
        udelay(1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8698
        /* Steps */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8699
        error = e1000_ich8_cycle_init(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8700
        if (error != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8701
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8702
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8703
        hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8704
        /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8705
        hsflctl.hsf_ctrl.fldbcount = size -1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8706
        hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_WRITE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8707
        E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8708
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8709
        /* Write the last 24 bits of index into Flash Linear address field in
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8710
         * Flash Address */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8711
        E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FADDR, flash_linear_address);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8712
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8713
        if (size == 1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8714
            flash_data = (uint32_t)data & 0x00FF;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8715
        else
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8716
            flash_data = (uint32_t)data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8717
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8718
        E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FDATA0, flash_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8719
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8720
        /* check if FCERR is set to 1 , if set to 1, clear it and try the whole
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8721
         * sequence a few more times else done */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8722
        error = e1000_ich8_flash_cycle(hw, ICH_FLASH_COMMAND_TIMEOUT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8723
        if (error == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8724
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8725
        } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8726
            /* If we're here, then things are most likely completely hosed,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8727
             * but if the error condition is detected, it won't hurt to give
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8728
             * it another try...ICH_FLASH_CYCLE_REPEAT_COUNT times.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8729
             */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8730
            hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8731
            if (hsfsts.hsf_status.flcerr == 1) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8732
                /* Repeat for some time before giving up. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8733
                continue;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8734
            } else if (hsfsts.hsf_status.flcdone == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8735
                DEBUGOUT("Timeout error - flash cycle did not complete.");
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8736
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8737
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8738
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8739
    } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8740
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8741
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8742
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8743
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8744
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8745
 * Reads a single byte from the NVM using the ICH8 flash access registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8746
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8747
 * hw - pointer to e1000_hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8748
 * index - The index of the byte to read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8749
 * data - Pointer to a byte to store the value read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8750
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8751
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8752
e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t* data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8753
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8754
    int32_t status = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8755
    uint16_t word = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8756
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8757
    status = e1000_read_ich8_data(hw, index, 1, &word);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8758
    if (status == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8759
        *data = (uint8_t)word;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8760
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8761
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8762
    return status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8763
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8764
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8765
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8766
 * Writes a single byte to the NVM using the ICH8 flash access registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8767
 * Performs verification by reading back the value and then going through
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8768
 * a retry algorithm before giving up.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8769
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8770
 * hw - pointer to e1000_hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8771
 * index - The index of the byte to write.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8772
 * byte - The byte to write to the NVM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8773
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8774
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8775
e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t byte)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8776
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8777
    int32_t error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8778
    int32_t program_retries = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8779
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8780
    DEBUGOUT2("Byte := %2.2X Offset := %d\n", byte, index);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8781
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8782
    error = e1000_write_ich8_byte(hw, index, byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8783
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8784
    if (error != E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8785
        for (program_retries = 0; program_retries < 100; program_retries++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8786
            DEBUGOUT2("Retrying \t Byte := %2.2X Offset := %d\n", byte, index);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8787
            error = e1000_write_ich8_byte(hw, index, byte);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8788
            udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8789
            if (error == E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8790
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8791
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8792
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8793
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8794
    if (program_retries == 100)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8795
        error = E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8796
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8797
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8798
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8799
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8800
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8801
 * Writes a single byte to the NVM using the ICH8 flash access registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8802
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8803
 * hw - pointer to e1000_hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8804
 * index - The index of the byte to read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8805
 * data - The byte to write to the NVM.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8806
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8807
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8808
e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8809
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8810
    int32_t status = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8811
    uint16_t word = (uint16_t)data;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8812
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8813
    status = e1000_write_ich8_data(hw, index, 1, word);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8814
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8815
    return status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8816
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8817
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8818
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8819
 * Reads a word from the NVM using the ICH8 flash access registers.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8820
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8821
 * hw - pointer to e1000_hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8822
 * index - The starting byte index of the word to read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8823
 * data - Pointer to a word to store the value read.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8824
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8825
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8826
e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t *data)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8827
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8828
    int32_t status = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8829
    status = e1000_read_ich8_data(hw, index, 2, data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8830
    return status;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8831
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8832
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8833
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8834
 * Erases the bank specified. Each bank may be a 4, 8 or 64k block. Banks are 0
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8835
 * based.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8836
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8837
 * hw - pointer to e1000_hw structure
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8838
 * bank - 0 for first bank, 1 for second bank
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8839
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8840
 * Note that this function may actually erase as much as 8 or 64 KBytes.  The
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8841
 * amount of NVM used in each bank is a *minimum* of 4 KBytes, but in fact the
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8842
 * bank size may be 4, 8 or 64 KBytes
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8843
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8844
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8845
e1000_erase_ich8_4k_segment(struct e1000_hw *hw, uint32_t bank)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8846
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8847
    union ich8_hws_flash_status hsfsts;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8848
    union ich8_hws_flash_ctrl hsflctl;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8849
    uint32_t flash_linear_address;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8850
    int32_t  count = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8851
    int32_t  error = E1000_ERR_EEPROM;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8852
    int32_t  iteration;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8853
    int32_t  sub_sector_size = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8854
    int32_t  bank_size;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8855
    int32_t  j = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8856
    int32_t  error_flag = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8857
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8858
    hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8859
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8860
    /* Determine HW Sector size: Read BERASE bits of Hw flash Status register */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8861
    /* 00: The Hw sector is 256 bytes, hence we need to erase 16
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8862
     *     consecutive sectors.  The start index for the nth Hw sector can be
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8863
     *     calculated as bank * 4096 + n * 256
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8864
     * 01: The Hw sector is 4K bytes, hence we need to erase 1 sector.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8865
     *     The start index for the nth Hw sector can be calculated
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8866
     *     as bank * 4096
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8867
     * 10: The HW sector is 8K bytes
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8868
     * 11: The Hw sector size is 64K bytes */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8869
    if (hsfsts.hsf_status.berasesz == 0x0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8870
        /* Hw sector size 256 */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8871
        sub_sector_size = ICH_FLASH_SEG_SIZE_256;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8872
        bank_size = ICH_FLASH_SECTOR_SIZE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8873
        iteration = ICH_FLASH_SECTOR_SIZE / ICH_FLASH_SEG_SIZE_256;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8874
    } else if (hsfsts.hsf_status.berasesz == 0x1) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8875
        bank_size = ICH_FLASH_SEG_SIZE_4K;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8876
        iteration = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8877
    } else if (hsfsts.hsf_status.berasesz == 0x3) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8878
        bank_size = ICH_FLASH_SEG_SIZE_64K;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8879
        iteration = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8880
    } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8881
        return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8882
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8883
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8884
    for (j = 0; j < iteration ; j++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8885
        do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8886
            count++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8887
            /* Steps */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8888
            error = e1000_ich8_cycle_init(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8889
            if (error != E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8890
                error_flag = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8891
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8892
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8893
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8894
            /* Write a value 11 (block Erase) in Flash Cycle field in Hw flash
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8895
             * Control */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8896
            hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8897
            hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_ERASE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8898
            E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8899
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8900
            /* Write the last 24 bits of an index within the block into Flash
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8901
             * Linear address field in Flash Address.  This probably needs to
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8902
             * be calculated here based off the on-chip erase sector size and
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8903
             * the software bank size (4, 8 or 64 KBytes) */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8904
            flash_linear_address = bank * bank_size + j * sub_sector_size;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8905
            flash_linear_address += hw->flash_base_addr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8906
            flash_linear_address &= ICH_FLASH_LINEAR_ADDR_MASK;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8907
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8908
            E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FADDR, flash_linear_address);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8909
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8910
            error = e1000_ich8_flash_cycle(hw, ICH_FLASH_ERASE_TIMEOUT);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8911
            /* Check if FCERR is set to 1.  If 1, clear it and try the whole
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8912
             * sequence a few more times else Done */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8913
            if (error == E1000_SUCCESS) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8914
                break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8915
            } else {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8916
                hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8917
                if (hsfsts.hsf_status.flcerr == 1) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8918
                    /* repeat for some time before giving up */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8919
                    continue;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8920
                } else if (hsfsts.hsf_status.flcdone == 0) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8921
                    error_flag = 1;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8922
                    break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8923
                }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8924
            }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8925
        } while ((count < ICH_FLASH_CYCLE_REPEAT_COUNT) && !error_flag);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8926
        if (error_flag == 1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8927
            break;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8928
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8929
    if (error_flag != 1)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8930
        error = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8931
    return error;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8932
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8933
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8934
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8935
e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8936
                                      uint32_t cnf_base_addr, uint32_t cnf_size)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8937
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8938
    uint32_t ret_val = E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8939
    uint16_t word_addr, reg_data, reg_addr;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8940
    uint16_t i;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8941
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8942
    /* cnf_base_addr is in DWORD */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8943
    word_addr = (uint16_t)(cnf_base_addr << 1);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8944
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8945
    /* cnf_size is returned in size of dwords */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8946
    for (i = 0; i < cnf_size; i++) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8947
        ret_val = e1000_read_eeprom(hw, (word_addr + i*2), 1, &reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8948
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8949
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8950
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8951
        ret_val = e1000_read_eeprom(hw, (word_addr + i*2 + 1), 1, &reg_addr);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8952
        if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8953
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8954
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8955
        ret_val = e1000_get_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8956
        if (ret_val != E1000_SUCCESS)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8957
            return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8958
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8959
        ret_val = e1000_write_phy_reg_ex(hw, (uint32_t)reg_addr, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8960
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8961
        e1000_release_software_flag(hw);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8962
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8963
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8964
    return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8965
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8966
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8967
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8968
/******************************************************************************
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8969
 * This function initializes the PHY from the NVM on ICH8 platforms. This
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8970
 * is needed due to an issue where the NVM configuration is not properly
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8971
 * autoloaded after power transitions. Therefore, after each PHY reset, we
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8972
 * will load the configuration data out of the NVM manually.
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8973
 *
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8974
 * hw: Struct containing variables accessed by shared code
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8975
 *****************************************************************************/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8976
static int32_t
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8977
e1000_init_lcd_from_nvm(struct e1000_hw *hw)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8978
{
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8979
    uint32_t reg_data, cnf_base_addr, cnf_size, ret_val, loop;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8980
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8981
    if (hw->phy_type != e1000_phy_igp_3)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8982
          return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8983
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8984
    /* Check if SW needs configure the PHY */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8985
    reg_data = E1000_READ_REG(hw, FEXTNVM);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8986
    if (!(reg_data & FEXTNVM_SW_CONFIG))
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8987
        return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8988
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8989
    /* Wait for basic configuration completes before proceeding*/
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8990
    loop = 0;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8991
    do {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8992
        reg_data = E1000_READ_REG(hw, STATUS) & E1000_STATUS_LAN_INIT_DONE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8993
        udelay(100);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8994
        loop++;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8995
    } while ((!reg_data) && (loop < 50));
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8996
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8997
    /* Clear the Init Done bit for the next init event */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8998
    reg_data = E1000_READ_REG(hw, STATUS);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  8999
    reg_data &= ~E1000_STATUS_LAN_INIT_DONE;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9000
    E1000_WRITE_REG(hw, STATUS, reg_data);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9001
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9002
    /* Make sure HW does not configure LCD from PHY extended configuration
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9003
       before SW configuration */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9004
    reg_data = E1000_READ_REG(hw, EXTCNF_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9005
    if ((reg_data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) == 0x0000) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9006
        reg_data = E1000_READ_REG(hw, EXTCNF_SIZE);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9007
        cnf_size = reg_data & E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9008
        cnf_size >>= 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9009
        if (cnf_size) {
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9010
            reg_data = E1000_READ_REG(hw, EXTCNF_CTRL);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9011
            cnf_base_addr = reg_data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9012
            /* cnf_base_addr is in DWORD */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9013
            cnf_base_addr >>= 16;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9014
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9015
            /* Configure LCD from extended configuration region. */
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9016
            ret_val = e1000_init_lcd_from_nvm_config_region(hw, cnf_base_addr,
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9017
                                                            cnf_size);
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9018
            if (ret_val)
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9019
                return ret_val;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9020
        }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9021
    }
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9022
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9023
    return E1000_SUCCESS;
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9024
}
9fe5df8b3a98 Added support for e1000 2.6.24, thanks to Matthias Luescher.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  9025