blob: 9d6edf3e73f92998d8fb4f19ddbbfe64cd2ca4ac [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*******************************************************************************
2
Auke Kok0abb6eb2006-09-27 12:53:14 -07003 Intel PRO/1000 Linux driver
4 Copyright(c) 1999 - 2006 Intel Corporation.
5
6 This program is free software; you can redistribute it and/or modify it
7 under the terms and conditions of the GNU General Public License,
8 version 2, as published by the Free Software Foundation.
9
10 This program is distributed in the hope it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 more details.
Auke Kok0abb6eb2006-09-27 12:53:14 -070014
Linus Torvalds1da177e2005-04-16 15:20:36 -070015 You should have received a copy of the GNU General Public License along with
Auke Kok0abb6eb2006-09-27 12:53:14 -070016 this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18
19 The full GNU General Public License is included in this distribution in
20 the file called "COPYING".
21
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 Contact Information:
23 Linux NICS <linux.nics@intel.com>
Auke Kok3d41e302006-04-14 19:05:31 -070024 e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Linus Torvalds1da177e2005-04-16 15:20:36 -070025 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26
27*******************************************************************************/
28
29/* e1000_hw.c
30 * Shared functions for accessing and configuring the MAC
31 */
32
Auke Kok8fc897b2006-08-28 14:56:16 -070033
Linus Torvalds1da177e2005-04-16 15:20:36 -070034#include "e1000_hw.h"
35
Joe Perches406874a2008-04-03 10:06:32 -070036static s32 e1000_swfw_sync_acquire(struct e1000_hw *hw, u16 mask);
37static void e1000_swfw_sync_release(struct e1000_hw *hw, u16 mask);
38static s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 reg_addr, u16 *data);
39static s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 reg_addr, u16 data);
40static s32 e1000_get_software_semaphore(struct e1000_hw *hw);
Nicholas Nunley35574762006-09-27 12:53:34 -070041static void e1000_release_software_semaphore(struct e1000_hw *hw);
42
Joe Perches406874a2008-04-03 10:06:32 -070043static u8 e1000_arc_subsystem_valid(struct e1000_hw *hw);
44static s32 e1000_check_downshift(struct e1000_hw *hw);
Joe Perches64798842008-07-11 15:17:02 -070045static s32 e1000_check_polarity(struct e1000_hw *hw,
46 e1000_rev_polarity *polarity);
Nicholas Nunley35574762006-09-27 12:53:34 -070047static void e1000_clear_hw_cntrs(struct e1000_hw *hw);
48static void e1000_clear_vfta(struct e1000_hw *hw);
Joe Perches406874a2008-04-03 10:06:32 -070049static s32 e1000_commit_shadow_ram(struct e1000_hw *hw);
50static s32 e1000_config_dsp_after_link_change(struct e1000_hw *hw,
Joe Perches64798842008-07-11 15:17:02 -070051 bool link_up);
Joe Perches406874a2008-04-03 10:06:32 -070052static s32 e1000_config_fc_after_link_up(struct e1000_hw *hw);
53static s32 e1000_detect_gig_phy(struct e1000_hw *hw);
54static s32 e1000_erase_ich8_4k_segment(struct e1000_hw *hw, u32 bank);
55static s32 e1000_get_auto_rd_done(struct e1000_hw *hw);
Joe Perches64798842008-07-11 15:17:02 -070056static s32 e1000_get_cable_length(struct e1000_hw *hw, u16 *min_length,
57 u16 *max_length);
Joe Perches406874a2008-04-03 10:06:32 -070058static s32 e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw);
59static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw);
60static s32 e1000_get_software_flag(struct e1000_hw *hw);
61static s32 e1000_ich8_cycle_init(struct e1000_hw *hw);
62static s32 e1000_ich8_flash_cycle(struct e1000_hw *hw, u32 timeout);
63static s32 e1000_id_led_init(struct e1000_hw *hw);
Joe Perches64798842008-07-11 15:17:02 -070064static s32 e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
65 u32 cnf_base_addr,
66 u32 cnf_size);
Joe Perches406874a2008-04-03 10:06:32 -070067static s32 e1000_init_lcd_from_nvm(struct e1000_hw *hw);
Nicholas Nunley35574762006-09-27 12:53:34 -070068static void e1000_init_rx_addrs(struct e1000_hw *hw);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -070069static void e1000_initialize_hardware_bits(struct e1000_hw *hw);
Joe Perchesc3033b02008-03-21 11:06:25 -070070static bool e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw);
Joe Perches406874a2008-04-03 10:06:32 -070071static s32 e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw);
72static s32 e1000_mng_enable_host_if(struct e1000_hw *hw);
Joe Perches64798842008-07-11 15:17:02 -070073static s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length,
74 u16 offset, u8 *sum);
75static s32 e1000_mng_write_cmd_header(struct e1000_hw* hw,
76 struct e1000_host_mng_command_header
77 *hdr);
Joe Perches406874a2008-04-03 10:06:32 -070078static s32 e1000_mng_write_commit(struct e1000_hw *hw);
Joe Perches64798842008-07-11 15:17:02 -070079static s32 e1000_phy_ife_get_info(struct e1000_hw *hw,
80 struct e1000_phy_info *phy_info);
81static s32 e1000_phy_igp_get_info(struct e1000_hw *hw,
82 struct e1000_phy_info *phy_info);
83static s32 e1000_read_eeprom_eerd(struct e1000_hw *hw, u16 offset, u16 words,
84 u16 *data);
85static s32 e1000_write_eeprom_eewr(struct e1000_hw *hw, u16 offset, u16 words,
86 u16 *data);
Joe Perches406874a2008-04-03 10:06:32 -070087static s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd);
Joe Perches64798842008-07-11 15:17:02 -070088static s32 e1000_phy_m88_get_info(struct e1000_hw *hw,
89 struct e1000_phy_info *phy_info);
Nicholas Nunley35574762006-09-27 12:53:34 -070090static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw);
Joe Perches406874a2008-04-03 10:06:32 -070091static s32 e1000_read_ich8_byte(struct e1000_hw *hw, u32 index, u8 *data);
Joe Perches64798842008-07-11 15:17:02 -070092static s32 e1000_verify_write_ich8_byte(struct e1000_hw *hw, u32 index,
93 u8 byte);
Joe Perches406874a2008-04-03 10:06:32 -070094static s32 e1000_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte);
95static s32 e1000_read_ich8_word(struct e1000_hw *hw, u32 index, u16 *data);
Joe Perches64798842008-07-11 15:17:02 -070096static s32 e1000_read_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
97 u16 *data);
98static s32 e1000_write_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
99 u16 data);
100static s32 e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
101 u16 *data);
102static s32 e1000_write_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
103 u16 *data);
Nicholas Nunley35574762006-09-27 12:53:34 -0700104static void e1000_release_software_flag(struct e1000_hw *hw);
Joe Perches406874a2008-04-03 10:06:32 -0700105static s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active);
106static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active);
107static s32 e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, u32 no_snoop);
Nicholas Nunley35574762006-09-27 12:53:34 -0700108static void e1000_set_pci_express_master_disable(struct e1000_hw *hw);
Joe Perches406874a2008-04-03 10:06:32 -0700109static s32 e1000_wait_autoneg(struct e1000_hw *hw);
110static void e1000_write_reg_io(struct e1000_hw *hw, u32 offset, u32 value);
111static s32 e1000_set_phy_type(struct e1000_hw *hw);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112static void e1000_phy_init_script(struct e1000_hw *hw);
Joe Perches406874a2008-04-03 10:06:32 -0700113static s32 e1000_setup_copper_link(struct e1000_hw *hw);
114static s32 e1000_setup_fiber_serdes_link(struct e1000_hw *hw);
115static s32 e1000_adjust_serdes_amplitude(struct e1000_hw *hw);
116static s32 e1000_phy_force_speed_duplex(struct e1000_hw *hw);
117static s32 e1000_config_mac_to_phy(struct e1000_hw *hw);
118static void e1000_raise_mdi_clk(struct e1000_hw *hw, u32 *ctrl);
119static void e1000_lower_mdi_clk(struct e1000_hw *hw, u32 *ctrl);
120static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, u32 data,
Joe Perches64798842008-07-11 15:17:02 -0700121 u16 count);
Joe Perches406874a2008-04-03 10:06:32 -0700122static u16 e1000_shift_in_mdi_bits(struct e1000_hw *hw);
123static s32 e1000_phy_reset_dsp(struct e1000_hw *hw);
124static s32 e1000_write_eeprom_spi(struct e1000_hw *hw, u16 offset,
125 u16 words, u16 *data);
Joe Perches64798842008-07-11 15:17:02 -0700126static s32 e1000_write_eeprom_microwire(struct e1000_hw *hw, u16 offset,
127 u16 words, u16 *data);
Joe Perches406874a2008-04-03 10:06:32 -0700128static s32 e1000_spi_eeprom_ready(struct e1000_hw *hw);
129static void e1000_raise_ee_clk(struct e1000_hw *hw, u32 *eecd);
130static void e1000_lower_ee_clk(struct e1000_hw *hw, u32 *eecd);
Joe Perches64798842008-07-11 15:17:02 -0700131static void e1000_shift_out_ee_bits(struct e1000_hw *hw, u16 data, u16 count);
Joe Perches406874a2008-04-03 10:06:32 -0700132static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
Joe Perches64798842008-07-11 15:17:02 -0700133 u16 phy_data);
Joe Perches406874a2008-04-03 10:06:32 -0700134static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw,u32 reg_addr,
Joe Perches64798842008-07-11 15:17:02 -0700135 u16 *phy_data);
Joe Perches406874a2008-04-03 10:06:32 -0700136static u16 e1000_shift_in_ee_bits(struct e1000_hw *hw, u16 count);
137static s32 e1000_acquire_eeprom(struct e1000_hw *hw);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138static void e1000_release_eeprom(struct e1000_hw *hw);
139static void e1000_standby_eeprom(struct e1000_hw *hw);
Joe Perches406874a2008-04-03 10:06:32 -0700140static s32 e1000_set_vco_speed(struct e1000_hw *hw);
141static s32 e1000_polarity_reversal_workaround(struct e1000_hw *hw);
142static s32 e1000_set_phy_mode(struct e1000_hw *hw);
143static s32 e1000_host_if_read_cookie(struct e1000_hw *hw, u8 *buffer);
144static u8 e1000_calculate_mng_checksum(char *buffer, u32 length);
Joe Perches64798842008-07-11 15:17:02 -0700145static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex);
Joe Perches406874a2008-04-03 10:06:32 -0700146static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147
148/* IGP cable length table */
149static const
Joe Perches406874a2008-04-03 10:06:32 -0700150u16 e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151 { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
152 5, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 25, 25, 25,
153 25, 25, 25, 25, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40, 40, 40,
154 40, 50, 50, 50, 50, 50, 50, 50, 60, 60, 60, 60, 60, 60, 60, 60,
155 60, 70, 70, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 90, 90, 90,
156 90, 90, 90, 90, 90, 90, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
157 100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
158 110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120};
159
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700160static const
Joe Perches406874a2008-04-03 10:06:32 -0700161u16 e1000_igp_2_cable_length_table[IGP02E1000_AGC_LENGTH_TABLE_SIZE] =
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -0400162 { 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 18, 21,
163 0, 0, 0, 3, 6, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41,
164 6, 10, 14, 18, 22, 26, 30, 33, 37, 41, 44, 48, 51, 54, 58, 61,
165 21, 26, 31, 35, 40, 44, 49, 53, 57, 61, 65, 68, 72, 75, 79, 82,
166 40, 45, 51, 56, 61, 66, 70, 75, 79, 83, 87, 91, 94, 98, 101, 104,
167 60, 66, 72, 77, 82, 87, 92, 96, 100, 104, 108, 111, 114, 117, 119, 121,
168 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124,
169 104, 109, 114, 118, 121, 124};
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700170
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171/******************************************************************************
172 * Set the phy type member in the hw struct.
173 *
174 * hw - Struct containing variables accessed by shared code
175 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -0700176static s32 e1000_set_phy_type(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177{
178 DEBUGFUNC("e1000_set_phy_type");
179
Auke Kok8fc897b2006-08-28 14:56:16 -0700180 if (hw->mac_type == e1000_undefined)
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700181 return -E1000_ERR_PHY_TYPE;
182
Auke Kok8fc897b2006-08-28 14:56:16 -0700183 switch (hw->phy_id) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700184 case M88E1000_E_PHY_ID:
185 case M88E1000_I_PHY_ID:
186 case M88E1011_I_PHY_ID:
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700187 case M88E1111_I_PHY_ID:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188 hw->phy_type = e1000_phy_m88;
189 break;
190 case IGP01E1000_I_PHY_ID:
Auke Kok8fc897b2006-08-28 14:56:16 -0700191 if (hw->mac_type == e1000_82541 ||
192 hw->mac_type == e1000_82541_rev_2 ||
193 hw->mac_type == e1000_82547 ||
194 hw->mac_type == e1000_82547_rev_2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195 hw->phy_type = e1000_phy_igp;
196 break;
197 }
Auke Kokcd94dd02006-06-27 09:08:22 -0700198 case IGP03E1000_E_PHY_ID:
199 hw->phy_type = e1000_phy_igp_3;
200 break;
201 case IFE_E_PHY_ID:
202 case IFE_PLUS_E_PHY_ID:
203 case IFE_C_E_PHY_ID:
204 hw->phy_type = e1000_phy_ife;
205 break;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -0800206 case GG82563_E_PHY_ID:
207 if (hw->mac_type == e1000_80003es2lan) {
208 hw->phy_type = e1000_phy_gg82563;
209 break;
210 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 /* Fall Through */
212 default:
213 /* Should never have loaded on this device */
214 hw->phy_type = e1000_phy_undefined;
215 return -E1000_ERR_PHY_TYPE;
216 }
217
218 return E1000_SUCCESS;
219}
220
221/******************************************************************************
222 * IGP phy init script - initializes the GbE PHY
223 *
224 * hw - Struct containing variables accessed by shared code
225 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -0700226static void e1000_phy_init_script(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227{
Joe Perches406874a2008-04-03 10:06:32 -0700228 u32 ret_val;
229 u16 phy_saved_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230
231 DEBUGFUNC("e1000_phy_init_script");
232
Auke Kok8fc897b2006-08-28 14:56:16 -0700233 if (hw->phy_init_script) {
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400234 msleep(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235
236 /* Save off the current value of register 0x2F5B to be restored at
237 * the end of this routine. */
238 ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
239
240 /* Disabled the PHY transmitter */
241 e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
242
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400243 msleep(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244
245 e1000_write_phy_reg(hw,0x0000,0x0140);
246
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400247 msleep(5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248
Auke Kok8fc897b2006-08-28 14:56:16 -0700249 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250 case e1000_82541:
251 case e1000_82547:
252 e1000_write_phy_reg(hw, 0x1F95, 0x0001);
253
254 e1000_write_phy_reg(hw, 0x1F71, 0xBD21);
255
256 e1000_write_phy_reg(hw, 0x1F79, 0x0018);
257
258 e1000_write_phy_reg(hw, 0x1F30, 0x1600);
259
260 e1000_write_phy_reg(hw, 0x1F31, 0x0014);
261
262 e1000_write_phy_reg(hw, 0x1F32, 0x161C);
263
264 e1000_write_phy_reg(hw, 0x1F94, 0x0003);
265
266 e1000_write_phy_reg(hw, 0x1F96, 0x003F);
267
268 e1000_write_phy_reg(hw, 0x2010, 0x0008);
269 break;
270
271 case e1000_82541_rev_2:
272 case e1000_82547_rev_2:
273 e1000_write_phy_reg(hw, 0x1F73, 0x0099);
274 break;
275 default:
276 break;
277 }
278
279 e1000_write_phy_reg(hw, 0x0000, 0x3300);
280
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400281 msleep(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282
283 /* Now enable the transmitter */
284 e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
285
Auke Kok8fc897b2006-08-28 14:56:16 -0700286 if (hw->mac_type == e1000_82547) {
Joe Perches406874a2008-04-03 10:06:32 -0700287 u16 fused, fine, coarse;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
289 /* Move to analog registers page */
290 e1000_read_phy_reg(hw, IGP01E1000_ANALOG_SPARE_FUSE_STATUS, &fused);
291
Auke Kok8fc897b2006-08-28 14:56:16 -0700292 if (!(fused & IGP01E1000_ANALOG_SPARE_FUSE_ENABLED)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 e1000_read_phy_reg(hw, IGP01E1000_ANALOG_FUSE_STATUS, &fused);
294
295 fine = fused & IGP01E1000_ANALOG_FUSE_FINE_MASK;
296 coarse = fused & IGP01E1000_ANALOG_FUSE_COARSE_MASK;
297
Auke Kok8fc897b2006-08-28 14:56:16 -0700298 if (coarse > IGP01E1000_ANALOG_FUSE_COARSE_THRESH) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299 coarse -= IGP01E1000_ANALOG_FUSE_COARSE_10;
300 fine -= IGP01E1000_ANALOG_FUSE_FINE_1;
Auke Kok8fc897b2006-08-28 14:56:16 -0700301 } else if (coarse == IGP01E1000_ANALOG_FUSE_COARSE_THRESH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302 fine -= IGP01E1000_ANALOG_FUSE_FINE_10;
303
304 fused = (fused & IGP01E1000_ANALOG_FUSE_POLY_MASK) |
305 (fine & IGP01E1000_ANALOG_FUSE_FINE_MASK) |
306 (coarse & IGP01E1000_ANALOG_FUSE_COARSE_MASK);
307
308 e1000_write_phy_reg(hw, IGP01E1000_ANALOG_FUSE_CONTROL, fused);
309 e1000_write_phy_reg(hw, IGP01E1000_ANALOG_FUSE_BYPASS,
310 IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL);
311 }
312 }
313 }
314}
315
316/******************************************************************************
317 * Set the mac type member in the hw struct.
318 *
319 * hw - Struct containing variables accessed by shared code
320 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -0700321s32 e1000_set_mac_type(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322{
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500323 DEBUGFUNC("e1000_set_mac_type");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500325 switch (hw->device_id) {
326 case E1000_DEV_ID_82542:
327 switch (hw->revision_id) {
328 case E1000_82542_2_0_REV_ID:
329 hw->mac_type = e1000_82542_rev2_0;
330 break;
331 case E1000_82542_2_1_REV_ID:
332 hw->mac_type = e1000_82542_rev2_1;
333 break;
334 default:
335 /* Invalid 82542 revision ID */
336 return -E1000_ERR_MAC_TYPE;
337 }
338 break;
339 case E1000_DEV_ID_82543GC_FIBER:
340 case E1000_DEV_ID_82543GC_COPPER:
341 hw->mac_type = e1000_82543;
342 break;
343 case E1000_DEV_ID_82544EI_COPPER:
344 case E1000_DEV_ID_82544EI_FIBER:
345 case E1000_DEV_ID_82544GC_COPPER:
346 case E1000_DEV_ID_82544GC_LOM:
347 hw->mac_type = e1000_82544;
348 break;
349 case E1000_DEV_ID_82540EM:
350 case E1000_DEV_ID_82540EM_LOM:
351 case E1000_DEV_ID_82540EP:
352 case E1000_DEV_ID_82540EP_LOM:
353 case E1000_DEV_ID_82540EP_LP:
354 hw->mac_type = e1000_82540;
355 break;
356 case E1000_DEV_ID_82545EM_COPPER:
357 case E1000_DEV_ID_82545EM_FIBER:
358 hw->mac_type = e1000_82545;
359 break;
360 case E1000_DEV_ID_82545GM_COPPER:
361 case E1000_DEV_ID_82545GM_FIBER:
362 case E1000_DEV_ID_82545GM_SERDES:
363 hw->mac_type = e1000_82545_rev_3;
364 break;
365 case E1000_DEV_ID_82546EB_COPPER:
366 case E1000_DEV_ID_82546EB_FIBER:
367 case E1000_DEV_ID_82546EB_QUAD_COPPER:
368 hw->mac_type = e1000_82546;
369 break;
370 case E1000_DEV_ID_82546GB_COPPER:
371 case E1000_DEV_ID_82546GB_FIBER:
372 case E1000_DEV_ID_82546GB_SERDES:
373 case E1000_DEV_ID_82546GB_PCIE:
374 case E1000_DEV_ID_82546GB_QUAD_COPPER:
375 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
376 hw->mac_type = e1000_82546_rev_3;
377 break;
378 case E1000_DEV_ID_82541EI:
379 case E1000_DEV_ID_82541EI_MOBILE:
380 case E1000_DEV_ID_82541ER_LOM:
381 hw->mac_type = e1000_82541;
382 break;
383 case E1000_DEV_ID_82541ER:
384 case E1000_DEV_ID_82541GI:
385 case E1000_DEV_ID_82541GI_LF:
386 case E1000_DEV_ID_82541GI_MOBILE:
387 hw->mac_type = e1000_82541_rev_2;
388 break;
389 case E1000_DEV_ID_82547EI:
390 case E1000_DEV_ID_82547EI_MOBILE:
391 hw->mac_type = e1000_82547;
392 break;
393 case E1000_DEV_ID_82547GI:
394 hw->mac_type = e1000_82547_rev_2;
395 break;
396 case E1000_DEV_ID_82571EB_COPPER:
397 case E1000_DEV_ID_82571EB_FIBER:
398 case E1000_DEV_ID_82571EB_SERDES:
Auke Kokce57a022007-08-09 14:09:34 -0700399 case E1000_DEV_ID_82571EB_SERDES_DUAL:
400 case E1000_DEV_ID_82571EB_SERDES_QUAD:
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500401 case E1000_DEV_ID_82571EB_QUAD_COPPER:
Auke Kokf4ec7f92007-08-30 11:23:58 -0700402 case E1000_DEV_ID_82571PT_QUAD_COPPER:
Auke Kokce57a022007-08-09 14:09:34 -0700403 case E1000_DEV_ID_82571EB_QUAD_FIBER:
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500404 case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE:
405 hw->mac_type = e1000_82571;
406 break;
407 case E1000_DEV_ID_82572EI_COPPER:
408 case E1000_DEV_ID_82572EI_FIBER:
409 case E1000_DEV_ID_82572EI_SERDES:
410 case E1000_DEV_ID_82572EI:
411 hw->mac_type = e1000_82572;
412 break;
413 case E1000_DEV_ID_82573E:
414 case E1000_DEV_ID_82573E_IAMT:
415 case E1000_DEV_ID_82573L:
416 hw->mac_type = e1000_82573;
417 break;
418 case E1000_DEV_ID_80003ES2LAN_COPPER_SPT:
419 case E1000_DEV_ID_80003ES2LAN_SERDES_SPT:
420 case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
421 case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
422 hw->mac_type = e1000_80003es2lan;
423 break;
424 case E1000_DEV_ID_ICH8_IGP_M_AMT:
425 case E1000_DEV_ID_ICH8_IGP_AMT:
426 case E1000_DEV_ID_ICH8_IGP_C:
427 case E1000_DEV_ID_ICH8_IFE:
428 case E1000_DEV_ID_ICH8_IFE_GT:
429 case E1000_DEV_ID_ICH8_IFE_G:
430 case E1000_DEV_ID_ICH8_IGP_M:
431 hw->mac_type = e1000_ich8lan;
432 break;
433 default:
434 /* Should never have loaded on this device */
435 return -E1000_ERR_MAC_TYPE;
436 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500438 switch (hw->mac_type) {
439 case e1000_ich8lan:
Joe Perchesc3033b02008-03-21 11:06:25 -0700440 hw->swfwhw_semaphore_present = true;
441 hw->asf_firmware_present = true;
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500442 break;
443 case e1000_80003es2lan:
Joe Perchesc3033b02008-03-21 11:06:25 -0700444 hw->swfw_sync_present = true;
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500445 /* fall through */
446 case e1000_82571:
447 case e1000_82572:
448 case e1000_82573:
Joe Perchesc3033b02008-03-21 11:06:25 -0700449 hw->eeprom_semaphore_present = true;
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500450 /* fall through */
451 case e1000_82541:
452 case e1000_82547:
453 case e1000_82541_rev_2:
454 case e1000_82547_rev_2:
Joe Perchesc3033b02008-03-21 11:06:25 -0700455 hw->asf_firmware_present = true;
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500456 break;
457 default:
458 break;
459 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460
Jeff Garzik167fb282006-12-15 10:41:15 -0500461 /* The 82543 chip does not count tx_carrier_errors properly in
462 * FD mode
463 */
464 if (hw->mac_type == e1000_82543)
Joe Perchesc3033b02008-03-21 11:06:25 -0700465 hw->bad_tx_carr_stats_fd = true;
Jeff Garzik167fb282006-12-15 10:41:15 -0500466
Jeff Garzik0fccd0e2006-12-15 10:56:10 -0500467 /* capable of receiving management packets to the host */
468 if (hw->mac_type >= e1000_82571)
Joe Perchesc3033b02008-03-21 11:06:25 -0700469 hw->has_manc2h = true;
Jeff Garzik0fccd0e2006-12-15 10:56:10 -0500470
Jeff Garzikbb8e3312006-12-15 11:06:17 -0500471 /* In rare occasions, ESB2 systems would end up started without
472 * the RX unit being turned on.
473 */
474 if (hw->mac_type == e1000_80003es2lan)
Joe Perchesc3033b02008-03-21 11:06:25 -0700475 hw->rx_needs_kicking = true;
Jeff Garzikbb8e3312006-12-15 11:06:17 -0500476
Jeff Garzik15e376b2006-12-15 11:16:33 -0500477 if (hw->mac_type > e1000_82544)
Joe Perchesc3033b02008-03-21 11:06:25 -0700478 hw->has_smbus = true;
Jeff Garzik15e376b2006-12-15 11:16:33 -0500479
Jeff Garzikbd2371e2006-12-15 10:31:40 -0500480 return E1000_SUCCESS;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481}
482
483/*****************************************************************************
484 * Set media type and TBI compatibility.
485 *
486 * hw - Struct containing variables accessed by shared code
487 * **************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -0700488void e1000_set_media_type(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489{
Joe Perches406874a2008-04-03 10:06:32 -0700490 u32 status;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491
492 DEBUGFUNC("e1000_set_media_type");
493
Auke Kok8fc897b2006-08-28 14:56:16 -0700494 if (hw->mac_type != e1000_82543) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495 /* tbi_compatibility is only valid on 82543 */
Joe Perchesc3033b02008-03-21 11:06:25 -0700496 hw->tbi_compatibility_en = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 }
498
499 switch (hw->device_id) {
500 case E1000_DEV_ID_82545GM_SERDES:
501 case E1000_DEV_ID_82546GB_SERDES:
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -0400502 case E1000_DEV_ID_82571EB_SERDES:
Auke Kokce57a022007-08-09 14:09:34 -0700503 case E1000_DEV_ID_82571EB_SERDES_DUAL:
504 case E1000_DEV_ID_82571EB_SERDES_QUAD:
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -0400505 case E1000_DEV_ID_82572EI_SERDES:
Jeff Kirsher6418ecc2006-03-02 18:21:10 -0800506 case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507 hw->media_type = e1000_media_type_internal_serdes;
508 break;
509 default:
Malli Chilakala3893d542005-06-17 17:44:49 -0700510 switch (hw->mac_type) {
511 case e1000_82542_rev2_0:
512 case e1000_82542_rev2_1:
513 hw->media_type = e1000_media_type_fiber;
514 break;
Auke Kokcd94dd02006-06-27 09:08:22 -0700515 case e1000_ich8lan:
Malli Chilakala3893d542005-06-17 17:44:49 -0700516 case e1000_82573:
517 /* The STATUS_TBIMODE bit is reserved or reused for the this
518 * device.
519 */
520 hw->media_type = e1000_media_type_copper;
521 break;
522 default:
Joe Perches1dc32912008-07-11 15:17:08 -0700523 status = er32(STATUS);
Malli Chilakala3893d542005-06-17 17:44:49 -0700524 if (status & E1000_STATUS_TBIMODE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525 hw->media_type = e1000_media_type_fiber;
526 /* tbi_compatibility not valid on fiber */
Joe Perchesc3033b02008-03-21 11:06:25 -0700527 hw->tbi_compatibility_en = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528 } else {
529 hw->media_type = e1000_media_type_copper;
530 }
Malli Chilakala3893d542005-06-17 17:44:49 -0700531 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532 }
533 }
534}
535
536/******************************************************************************
537 * Reset the transmit and receive units; mask and clear all interrupts.
538 *
539 * hw - Struct containing variables accessed by shared code
540 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -0700541s32 e1000_reset_hw(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542{
Joe Perches406874a2008-04-03 10:06:32 -0700543 u32 ctrl;
544 u32 ctrl_ext;
545 u32 icr;
546 u32 manc;
547 u32 led_ctrl;
548 u32 timeout;
549 u32 extcnf_ctrl;
550 s32 ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551
552 DEBUGFUNC("e1000_reset_hw");
553
554 /* For 82542 (rev 2.0), disable MWI before issuing a device reset */
Auke Kok8fc897b2006-08-28 14:56:16 -0700555 if (hw->mac_type == e1000_82542_rev2_0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");
557 e1000_pci_clear_mwi(hw);
558 }
559
Auke Kok8fc897b2006-08-28 14:56:16 -0700560 if (hw->bus_type == e1000_bus_type_pci_express) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700561 /* Prevent the PCI-E bus from sticking if there is no TLP connection
562 * on the last TLP read/write transaction when MAC is reset.
563 */
Auke Kok8fc897b2006-08-28 14:56:16 -0700564 if (e1000_disable_pciex_master(hw) != E1000_SUCCESS) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700565 DEBUGOUT("PCI-E Master disable polling has failed.\n");
566 }
567 }
568
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 /* Clear interrupt mask to stop board from generating interrupts */
570 DEBUGOUT("Masking off all interrupts\n");
Joe Perches1dc32912008-07-11 15:17:08 -0700571 ew32(IMC, 0xffffffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572
573 /* Disable the Transmit and Receive units. Then delay to allow
574 * any pending transactions to complete before we hit the MAC with
575 * the global reset.
576 */
Joe Perches1dc32912008-07-11 15:17:08 -0700577 ew32(RCTL, 0);
578 ew32(TCTL, E1000_TCTL_PSP);
579 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580
581 /* The tbi_compatibility_on Flag must be cleared when Rctl is cleared. */
Joe Perchesc3033b02008-03-21 11:06:25 -0700582 hw->tbi_compatibility_on = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583
584 /* Delay to allow any outstanding PCI transactions to complete before
585 * resetting the device
586 */
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400587 msleep(10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588
Joe Perches1dc32912008-07-11 15:17:08 -0700589 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590
591 /* Must reset the PHY before resetting the MAC */
Auke Kok8fc897b2006-08-28 14:56:16 -0700592 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
Joe Perches1dc32912008-07-11 15:17:08 -0700593 ew32(CTRL, (ctrl | E1000_CTRL_PHY_RST));
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400594 msleep(5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 }
596
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700597 /* Must acquire the MDIO ownership before MAC reset.
598 * Ownership defaults to firmware after a reset. */
Auke Kok8fc897b2006-08-28 14:56:16 -0700599 if (hw->mac_type == e1000_82573) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700600 timeout = 10;
601
Joe Perches1dc32912008-07-11 15:17:08 -0700602 extcnf_ctrl = er32(EXTCNF_CTRL);
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700603 extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
604
605 do {
Joe Perches1dc32912008-07-11 15:17:08 -0700606 ew32(EXTCNF_CTRL, extcnf_ctrl);
607 extcnf_ctrl = er32(EXTCNF_CTRL);
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700608
Auke Kok8fc897b2006-08-28 14:56:16 -0700609 if (extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP)
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700610 break;
611 else
612 extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
613
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400614 msleep(2);
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700615 timeout--;
Auke Kok8fc897b2006-08-28 14:56:16 -0700616 } while (timeout);
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700617 }
618
Auke Kokcd94dd02006-06-27 09:08:22 -0700619 /* Workaround for ICH8 bit corruption issue in FIFO memory */
620 if (hw->mac_type == e1000_ich8lan) {
621 /* Set Tx and Rx buffer allocation to 8k apiece. */
Joe Perches1dc32912008-07-11 15:17:08 -0700622 ew32(PBA, E1000_PBA_8K);
Auke Kokcd94dd02006-06-27 09:08:22 -0700623 /* Set Packet Buffer Size to 16k. */
Joe Perches1dc32912008-07-11 15:17:08 -0700624 ew32(PBS, E1000_PBS_16K);
Auke Kokcd94dd02006-06-27 09:08:22 -0700625 }
626
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 /* Issue a global reset to the MAC. This will reset the chip's
628 * transmit, receive, DMA, and link units. It will not effect
629 * the current PCI configuration. The global reset bit is self-
630 * clearing, and should clear within a microsecond.
631 */
632 DEBUGOUT("Issuing a global reset to MAC\n");
633
Auke Kok8fc897b2006-08-28 14:56:16 -0700634 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 case e1000_82544:
636 case e1000_82540:
637 case e1000_82545:
638 case e1000_82546:
639 case e1000_82541:
640 case e1000_82541_rev_2:
641 /* These controllers can't ack the 64-bit write when issuing the
642 * reset, so use IO-mapping as a workaround to issue the reset */
643 E1000_WRITE_REG_IO(hw, CTRL, (ctrl | E1000_CTRL_RST));
644 break;
645 case e1000_82545_rev_3:
646 case e1000_82546_rev_3:
647 /* Reset is performed on a shadow of the control register */
Joe Perches1dc32912008-07-11 15:17:08 -0700648 ew32(CTRL_DUP, (ctrl | E1000_CTRL_RST));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649 break;
Auke Kokcd94dd02006-06-27 09:08:22 -0700650 case e1000_ich8lan:
651 if (!hw->phy_reset_disable &&
652 e1000_check_phy_reset_block(hw) == E1000_SUCCESS) {
653 /* e1000_ich8lan PHY HW reset requires MAC CORE reset
654 * at the same time to make sure the interface between
655 * MAC and the external PHY is reset.
656 */
657 ctrl |= E1000_CTRL_PHY_RST;
658 }
659
660 e1000_get_software_flag(hw);
Joe Perches1dc32912008-07-11 15:17:08 -0700661 ew32(CTRL, (ctrl | E1000_CTRL_RST));
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400662 msleep(5);
Auke Kokcd94dd02006-06-27 09:08:22 -0700663 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 default:
Joe Perches1dc32912008-07-11 15:17:08 -0700665 ew32(CTRL, (ctrl | E1000_CTRL_RST));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666 break;
667 }
668
669 /* After MAC reset, force reload of EEPROM to restore power-on settings to
670 * device. Later controllers reload the EEPROM automatically, so just wait
671 * for reload to complete.
672 */
Auke Kok8fc897b2006-08-28 14:56:16 -0700673 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 case e1000_82542_rev2_0:
675 case e1000_82542_rev2_1:
676 case e1000_82543:
677 case e1000_82544:
678 /* Wait for reset to complete */
679 udelay(10);
Joe Perches1dc32912008-07-11 15:17:08 -0700680 ctrl_ext = er32(CTRL_EXT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 ctrl_ext |= E1000_CTRL_EXT_EE_RST;
Joe Perches1dc32912008-07-11 15:17:08 -0700682 ew32(CTRL_EXT, ctrl_ext);
683 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 /* Wait for EEPROM reload */
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400685 msleep(2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 break;
687 case e1000_82541:
688 case e1000_82541_rev_2:
689 case e1000_82547:
690 case e1000_82547_rev_2:
691 /* Wait for EEPROM reload */
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400692 msleep(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 break;
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700694 case e1000_82573:
Joe Perchesc3033b02008-03-21 11:06:25 -0700695 if (!e1000_is_onboard_nvm_eeprom(hw)) {
Jeff Kirsherfd803242005-12-13 00:06:22 -0500696 udelay(10);
Joe Perches1dc32912008-07-11 15:17:08 -0700697 ctrl_ext = er32(CTRL_EXT);
Jeff Kirsherfd803242005-12-13 00:06:22 -0500698 ctrl_ext |= E1000_CTRL_EXT_EE_RST;
Joe Perches1dc32912008-07-11 15:17:08 -0700699 ew32(CTRL_EXT, ctrl_ext);
700 E1000_WRITE_FLUSH();
Jeff Kirsherfd803242005-12-13 00:06:22 -0500701 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700702 /* fall through */
Jeff Kirsher2a88c172006-09-27 12:54:05 -0700703 default:
704 /* Auto read done will delay 5ms or poll based on mac type */
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700705 ret_val = e1000_get_auto_rd_done(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -0700706 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700707 return ret_val;
708 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709 }
710
711 /* Disable HW ARPs on ASF enabled adapters */
Auke Kok8fc897b2006-08-28 14:56:16 -0700712 if (hw->mac_type >= e1000_82540 && hw->mac_type <= e1000_82547_rev_2) {
Joe Perches1dc32912008-07-11 15:17:08 -0700713 manc = er32(MANC);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 manc &= ~(E1000_MANC_ARP_EN);
Joe Perches1dc32912008-07-11 15:17:08 -0700715 ew32(MANC, manc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 }
717
Auke Kok8fc897b2006-08-28 14:56:16 -0700718 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 e1000_phy_init_script(hw);
720
721 /* Configure activity LED after PHY reset */
Joe Perches1dc32912008-07-11 15:17:08 -0700722 led_ctrl = er32(LEDCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 led_ctrl &= IGP_ACTIVITY_LED_MASK;
724 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
Joe Perches1dc32912008-07-11 15:17:08 -0700725 ew32(LEDCTL, led_ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726 }
727
728 /* Clear interrupt mask to stop board from generating interrupts */
729 DEBUGOUT("Masking off all interrupts\n");
Joe Perches1dc32912008-07-11 15:17:08 -0700730 ew32(IMC, 0xffffffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731
732 /* Clear any pending interrupt events. */
Joe Perches1dc32912008-07-11 15:17:08 -0700733 icr = er32(ICR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734
735 /* If MWI was previously enabled, reenable it. */
Auke Kok8fc897b2006-08-28 14:56:16 -0700736 if (hw->mac_type == e1000_82542_rev2_0) {
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400737 if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738 e1000_pci_set_mwi(hw);
739 }
740
Auke Kokcd94dd02006-06-27 09:08:22 -0700741 if (hw->mac_type == e1000_ich8lan) {
Joe Perches1dc32912008-07-11 15:17:08 -0700742 u32 kab = er32(KABGTXD);
Auke Kokcd94dd02006-06-27 09:08:22 -0700743 kab |= E1000_KABGTXD_BGSQLBIAS;
Joe Perches1dc32912008-07-11 15:17:08 -0700744 ew32(KABGTXD, kab);
Auke Kokcd94dd02006-06-27 09:08:22 -0700745 }
746
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 return E1000_SUCCESS;
748}
749
750/******************************************************************************
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700751 *
752 * Initialize a number of hardware-dependent bits
753 *
754 * hw: Struct containing variables accessed by shared code
755 *
756 * This function contains hardware limitation workarounds for PCI-E adapters
757 *
758 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -0700759static void e1000_initialize_hardware_bits(struct e1000_hw *hw)
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700760{
761 if ((hw->mac_type >= e1000_82571) && (!hw->initialize_hw_bits_disable)) {
762 /* Settings common to all PCI-express silicon */
Joe Perches406874a2008-04-03 10:06:32 -0700763 u32 reg_ctrl, reg_ctrl_ext;
764 u32 reg_tarc0, reg_tarc1;
765 u32 reg_tctl;
766 u32 reg_txdctl, reg_txdctl1;
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700767
768 /* link autonegotiation/sync workarounds */
Joe Perches1dc32912008-07-11 15:17:08 -0700769 reg_tarc0 = er32(TARC0);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700770 reg_tarc0 &= ~((1 << 30)|(1 << 29)|(1 << 28)|(1 << 27));
771
772 /* Enable not-done TX descriptor counting */
Joe Perches1dc32912008-07-11 15:17:08 -0700773 reg_txdctl = er32(TXDCTL);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700774 reg_txdctl |= E1000_TXDCTL_COUNT_DESC;
Joe Perches1dc32912008-07-11 15:17:08 -0700775 ew32(TXDCTL, reg_txdctl);
776 reg_txdctl1 = er32(TXDCTL1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700777 reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC;
Joe Perches1dc32912008-07-11 15:17:08 -0700778 ew32(TXDCTL1, reg_txdctl1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700779
780 switch (hw->mac_type) {
781 case e1000_82571:
782 case e1000_82572:
783 /* Clear PHY TX compatible mode bits */
Joe Perches1dc32912008-07-11 15:17:08 -0700784 reg_tarc1 = er32(TARC1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700785 reg_tarc1 &= ~((1 << 30)|(1 << 29));
786
787 /* link autonegotiation/sync workarounds */
788 reg_tarc0 |= ((1 << 26)|(1 << 25)|(1 << 24)|(1 << 23));
789
790 /* TX ring control fixes */
791 reg_tarc1 |= ((1 << 26)|(1 << 25)|(1 << 24));
792
793 /* Multiple read bit is reversed polarity */
Joe Perches1dc32912008-07-11 15:17:08 -0700794 reg_tctl = er32(TCTL);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700795 if (reg_tctl & E1000_TCTL_MULR)
796 reg_tarc1 &= ~(1 << 28);
797 else
798 reg_tarc1 |= (1 << 28);
799
Joe Perches1dc32912008-07-11 15:17:08 -0700800 ew32(TARC1, reg_tarc1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700801 break;
802 case e1000_82573:
Joe Perches1dc32912008-07-11 15:17:08 -0700803 reg_ctrl_ext = er32(CTRL_EXT);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700804 reg_ctrl_ext &= ~(1 << 23);
805 reg_ctrl_ext |= (1 << 22);
806
807 /* TX byte count fix */
Joe Perches1dc32912008-07-11 15:17:08 -0700808 reg_ctrl = er32(CTRL);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700809 reg_ctrl &= ~(1 << 29);
810
Joe Perches1dc32912008-07-11 15:17:08 -0700811 ew32(CTRL_EXT, reg_ctrl_ext);
812 ew32(CTRL, reg_ctrl);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700813 break;
814 case e1000_80003es2lan:
815 /* improve small packet performace for fiber/serdes */
816 if ((hw->media_type == e1000_media_type_fiber) ||
817 (hw->media_type == e1000_media_type_internal_serdes)) {
818 reg_tarc0 &= ~(1 << 20);
819 }
820
821 /* Multiple read bit is reversed polarity */
Joe Perches1dc32912008-07-11 15:17:08 -0700822 reg_tctl = er32(TCTL);
823 reg_tarc1 = er32(TARC1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700824 if (reg_tctl & E1000_TCTL_MULR)
825 reg_tarc1 &= ~(1 << 28);
826 else
827 reg_tarc1 |= (1 << 28);
828
Joe Perches1dc32912008-07-11 15:17:08 -0700829 ew32(TARC1, reg_tarc1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700830 break;
831 case e1000_ich8lan:
832 /* Reduce concurrent DMA requests to 3 from 4 */
833 if ((hw->revision_id < 3) ||
834 ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) &&
835 (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))
836 reg_tarc0 |= ((1 << 29)|(1 << 28));
837
Joe Perches1dc32912008-07-11 15:17:08 -0700838 reg_ctrl_ext = er32(CTRL_EXT);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700839 reg_ctrl_ext |= (1 << 22);
Joe Perches1dc32912008-07-11 15:17:08 -0700840 ew32(CTRL_EXT, reg_ctrl_ext);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700841
842 /* workaround TX hang with TSO=on */
843 reg_tarc0 |= ((1 << 27)|(1 << 26)|(1 << 24)|(1 << 23));
844
845 /* Multiple read bit is reversed polarity */
Joe Perches1dc32912008-07-11 15:17:08 -0700846 reg_tctl = er32(TCTL);
847 reg_tarc1 = er32(TARC1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700848 if (reg_tctl & E1000_TCTL_MULR)
849 reg_tarc1 &= ~(1 << 28);
850 else
851 reg_tarc1 |= (1 << 28);
852
853 /* workaround TX hang with TSO=on */
854 reg_tarc1 |= ((1 << 30)|(1 << 26)|(1 << 24));
855
Joe Perches1dc32912008-07-11 15:17:08 -0700856 ew32(TARC1, reg_tarc1);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700857 break;
858 default:
859 break;
860 }
861
Joe Perches1dc32912008-07-11 15:17:08 -0700862 ew32(TARC0, reg_tarc0);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700863 }
864}
865
866/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 * Performs basic configuration of the adapter.
868 *
869 * hw - Struct containing variables accessed by shared code
870 *
871 * Assumes that the controller has previously been reset and is in a
872 * post-reset uninitialized state. Initializes the receive address registers,
873 * multicast table, and VLAN filter table. Calls routines to setup link
874 * configuration and flow control settings. Clears all on-chip counters. Leaves
875 * the transmit and receive units disabled and uninitialized.
876 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -0700877s32 e1000_init_hw(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878{
Joe Perches406874a2008-04-03 10:06:32 -0700879 u32 ctrl;
880 u32 i;
881 s32 ret_val;
882 u32 mta_size;
883 u32 reg_data;
884 u32 ctrl_ext;
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700885
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886 DEBUGFUNC("e1000_init_hw");
887
Jeff Kirsher7820d422006-08-16 13:39:00 -0700888 /* force full DMA clock frequency for 10/100 on ICH8 A0-B0 */
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700889 if ((hw->mac_type == e1000_ich8lan) &&
890 ((hw->revision_id < 3) ||
891 ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) &&
892 (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))) {
Joe Perches1dc32912008-07-11 15:17:08 -0700893 reg_data = er32(STATUS);
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700894 reg_data &= ~0x80000000;
Joe Perches1dc32912008-07-11 15:17:08 -0700895 ew32(STATUS, reg_data);
Jeff Kirsher7820d422006-08-16 13:39:00 -0700896 }
897
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 /* Initialize Identification LED */
899 ret_val = e1000_id_led_init(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -0700900 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 DEBUGOUT("Error Initializing Identification LED\n");
902 return ret_val;
903 }
904
905 /* Set the media type and TBI compatibility */
906 e1000_set_media_type(hw);
907
Jeff Kirsher09ae3e82006-09-27 12:53:51 -0700908 /* Must be called after e1000_set_media_type because media_type is used */
909 e1000_initialize_hardware_bits(hw);
910
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 /* Disabling VLAN filtering. */
912 DEBUGOUT("Initializing the IEEE VLAN\n");
Auke Kokcd94dd02006-06-27 09:08:22 -0700913 /* VET hardcoded to standard value and VFTA removed in ICH8 LAN */
914 if (hw->mac_type != e1000_ich8lan) {
915 if (hw->mac_type < e1000_82545_rev_3)
Joe Perches1dc32912008-07-11 15:17:08 -0700916 ew32(VET, 0);
Auke Kokcd94dd02006-06-27 09:08:22 -0700917 e1000_clear_vfta(hw);
918 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919
920 /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */
Auke Kok8fc897b2006-08-28 14:56:16 -0700921 if (hw->mac_type == e1000_82542_rev2_0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922 DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");
923 e1000_pci_clear_mwi(hw);
Joe Perches1dc32912008-07-11 15:17:08 -0700924 ew32(RCTL, E1000_RCTL_RST);
925 E1000_WRITE_FLUSH();
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400926 msleep(5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927 }
928
929 /* Setup the receive address. This involves initializing all of the Receive
930 * Address Registers (RARs 0 - 15).
931 */
932 e1000_init_rx_addrs(hw);
933
934 /* For 82542 (rev 2.0), take the receiver out of reset and enable MWI */
Auke Kok8fc897b2006-08-28 14:56:16 -0700935 if (hw->mac_type == e1000_82542_rev2_0) {
Joe Perches1dc32912008-07-11 15:17:08 -0700936 ew32(RCTL, 0);
937 E1000_WRITE_FLUSH();
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400938 msleep(1);
939 if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940 e1000_pci_set_mwi(hw);
941 }
942
943 /* Zero out the Multicast HASH table */
944 DEBUGOUT("Zeroing the MTA\n");
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700945 mta_size = E1000_MC_TBL_SIZE;
Auke Kokcd94dd02006-06-27 09:08:22 -0700946 if (hw->mac_type == e1000_ich8lan)
947 mta_size = E1000_MC_TBL_SIZE_ICH8LAN;
Auke Kok8fc897b2006-08-28 14:56:16 -0700948 for (i = 0; i < mta_size; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700949 E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
Auke Kok4ca213a2006-06-27 09:07:08 -0700950 /* use write flush to prevent Memory Write Block (MWB) from
951 * occuring when accessing our register space */
Joe Perches1dc32912008-07-11 15:17:08 -0700952 E1000_WRITE_FLUSH();
Auke Kok4ca213a2006-06-27 09:07:08 -0700953 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954
955 /* Set the PCI priority bit correctly in the CTRL register. This
956 * determines if the adapter gives priority to receives, or if it
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700957 * gives equal priority to transmits and receives. Valid only on
958 * 82542 and 82543 silicon.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 */
Auke Kok8fc897b2006-08-28 14:56:16 -0700960 if (hw->dma_fairness && hw->mac_type <= e1000_82543) {
Joe Perches1dc32912008-07-11 15:17:08 -0700961 ctrl = er32(CTRL);
962 ew32(CTRL, ctrl | E1000_CTRL_PRIOR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 }
964
Auke Kok8fc897b2006-08-28 14:56:16 -0700965 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966 case e1000_82545_rev_3:
967 case e1000_82546_rev_3:
968 break;
969 default:
970 /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */
Peter Oruba007755e2007-09-28 22:42:06 -0700971 if (hw->bus_type == e1000_bus_type_pcix && e1000_pcix_get_mmrbc(hw) > 2048)
972 e1000_pcix_set_mmrbc(hw, 2048);
973 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974 }
975
Auke Kokcd94dd02006-06-27 09:08:22 -0700976 /* More time needed for PHY to initialize */
977 if (hw->mac_type == e1000_ich8lan)
Jeff Garzikf8ec4732006-09-19 15:27:07 -0400978 msleep(15);
Auke Kokcd94dd02006-06-27 09:08:22 -0700979
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 /* Call a subroutine to configure the link and setup flow control. */
981 ret_val = e1000_setup_link(hw);
982
983 /* Set the transmit descriptor write-back policy */
Auke Kok8fc897b2006-08-28 14:56:16 -0700984 if (hw->mac_type > e1000_82544) {
Joe Perches1dc32912008-07-11 15:17:08 -0700985 ctrl = er32(TXDCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
Joe Perches1dc32912008-07-11 15:17:08 -0700987 ew32(TXDCTL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 }
989
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700990 if (hw->mac_type == e1000_82573) {
Auke Kok76c224b2006-05-23 13:36:06 -0700991 e1000_enable_tx_pkt_filtering(hw);
Malli Chilakala2d7edb92005-04-28 19:43:52 -0700992 }
993
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -0400994 switch (hw->mac_type) {
995 default:
996 break;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -0800997 case e1000_80003es2lan:
998 /* Enable retransmit on late collisions */
Joe Perches1dc32912008-07-11 15:17:08 -0700999 reg_data = er32(TCTL);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001000 reg_data |= E1000_TCTL_RTLC;
Joe Perches1dc32912008-07-11 15:17:08 -07001001 ew32(TCTL, reg_data);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001002
1003 /* Configure Gigabit Carry Extend Padding */
Joe Perches1dc32912008-07-11 15:17:08 -07001004 reg_data = er32(TCTL_EXT);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001005 reg_data &= ~E1000_TCTL_EXT_GCEX_MASK;
1006 reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
Joe Perches1dc32912008-07-11 15:17:08 -07001007 ew32(TCTL_EXT, reg_data);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001008
1009 /* Configure Transmit Inter-Packet Gap */
Joe Perches1dc32912008-07-11 15:17:08 -07001010 reg_data = er32(TIPG);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001011 reg_data &= ~E1000_TIPG_IPGT_MASK;
1012 reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
Joe Perches1dc32912008-07-11 15:17:08 -07001013 ew32(TIPG, reg_data);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001014
1015 reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001);
1016 reg_data &= ~0x00100000;
1017 E1000_WRITE_REG_ARRAY(hw, FFLT, 0x0001, reg_data);
1018 /* Fall through */
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04001019 case e1000_82571:
Mallikarjuna R Chilakalaa7990ba2005-10-04 07:08:19 -04001020 case e1000_82572:
Auke Kokcd94dd02006-06-27 09:08:22 -07001021 case e1000_ich8lan:
Joe Perches1dc32912008-07-11 15:17:08 -07001022 ctrl = er32(TXDCTL1);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001023 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
Joe Perches1dc32912008-07-11 15:17:08 -07001024 ew32(TXDCTL1, ctrl);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04001025 break;
1026 }
1027
1028
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04001029 if (hw->mac_type == e1000_82573) {
Joe Perches1dc32912008-07-11 15:17:08 -07001030 u32 gcr = er32(GCR);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04001031 gcr |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX;
Joe Perches1dc32912008-07-11 15:17:08 -07001032 ew32(GCR, gcr);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04001033 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001034
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 /* Clear all of the statistics registers (clear on read). It is
1036 * important that we do this after we have tried to establish link
1037 * because the symbol error count will increment wildly if there
1038 * is no link.
1039 */
1040 e1000_clear_hw_cntrs(hw);
1041
Auke Kokcd94dd02006-06-27 09:08:22 -07001042 /* ICH8 No-snoop bits are opposite polarity.
1043 * Set to snoop by default after reset. */
1044 if (hw->mac_type == e1000_ich8lan)
1045 e1000_set_pci_ex_no_snoop(hw, PCI_EX_82566_SNOOP_ALL);
1046
Jeff Kirsherb7ee49d2006-01-12 16:51:21 -08001047 if (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER ||
1048 hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3) {
Joe Perches1dc32912008-07-11 15:17:08 -07001049 ctrl_ext = er32(CTRL_EXT);
Jeff Kirsherb7ee49d2006-01-12 16:51:21 -08001050 /* Relaxed ordering must be disabled to avoid a parity
1051 * error crash in a PCI slot. */
1052 ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
Joe Perches1dc32912008-07-11 15:17:08 -07001053 ew32(CTRL_EXT, ctrl_ext);
Jeff Kirsherb7ee49d2006-01-12 16:51:21 -08001054 }
1055
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 return ret_val;
1057}
1058
1059/******************************************************************************
1060 * Adjust SERDES output amplitude based on EEPROM setting.
1061 *
1062 * hw - Struct containing variables accessed by shared code.
1063 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001064static s32 e1000_adjust_serdes_amplitude(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065{
Joe Perches406874a2008-04-03 10:06:32 -07001066 u16 eeprom_data;
1067 s32 ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068
1069 DEBUGFUNC("e1000_adjust_serdes_amplitude");
1070
Auke Kok8fc897b2006-08-28 14:56:16 -07001071 if (hw->media_type != e1000_media_type_internal_serdes)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 return E1000_SUCCESS;
1073
Auke Kok8fc897b2006-08-28 14:56:16 -07001074 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 case e1000_82545_rev_3:
1076 case e1000_82546_rev_3:
1077 break;
1078 default:
1079 return E1000_SUCCESS;
1080 }
1081
1082 ret_val = e1000_read_eeprom(hw, EEPROM_SERDES_AMPLITUDE, 1, &eeprom_data);
1083 if (ret_val) {
1084 return ret_val;
1085 }
1086
Auke Kok8fc897b2006-08-28 14:56:16 -07001087 if (eeprom_data != EEPROM_RESERVED_WORD) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088 /* Adjust SERDES output amplitude only. */
Auke Kok76c224b2006-05-23 13:36:06 -07001089 eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, eeprom_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001091 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092 return ret_val;
1093 }
1094
1095 return E1000_SUCCESS;
1096}
1097
1098/******************************************************************************
1099 * Configures flow control and link settings.
1100 *
1101 * hw - Struct containing variables accessed by shared code
1102 *
1103 * Determines which flow control settings to use. Calls the apropriate media-
1104 * specific link configuration function. Configures the flow control settings.
1105 * Assuming the adapter has a valid link partner, a valid link should be
1106 * established. Assumes the hardware has previously been reset and the
1107 * transmitter and receiver are not enabled.
1108 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001109s32 e1000_setup_link(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110{
Joe Perches406874a2008-04-03 10:06:32 -07001111 u32 ctrl_ext;
1112 s32 ret_val;
1113 u16 eeprom_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114
1115 DEBUGFUNC("e1000_setup_link");
1116
Jeff Kirsher526f9952006-01-12 16:50:46 -08001117 /* In the case of the phy reset being blocked, we already have a link.
1118 * We do not have to set it up again. */
1119 if (e1000_check_phy_reset_block(hw))
1120 return E1000_SUCCESS;
1121
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 /* Read and store word 0x0F of the EEPROM. This word contains bits
1123 * that determine the hardware's default PAUSE (flow control) mode,
1124 * a bit that determines whether the HW defaults to enabling or
1125 * disabling auto-negotiation, and the direction of the
1126 * SW defined pins. If there is no SW over-ride of the flow
1127 * control setting, then the variable hw->fc will
1128 * be initialized based on a value in the EEPROM.
1129 */
Jeff Kirsher11241b12006-09-27 12:53:28 -07001130 if (hw->fc == E1000_FC_DEFAULT) {
Jeff Kirsherfd803242005-12-13 00:06:22 -05001131 switch (hw->mac_type) {
Auke Kokcd94dd02006-06-27 09:08:22 -07001132 case e1000_ich8lan:
Jeff Kirsherfd803242005-12-13 00:06:22 -05001133 case e1000_82573:
Jeff Kirsher11241b12006-09-27 12:53:28 -07001134 hw->fc = E1000_FC_FULL;
Jeff Kirsherfd803242005-12-13 00:06:22 -05001135 break;
1136 default:
1137 ret_val = e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG,
1138 1, &eeprom_data);
1139 if (ret_val) {
1140 DEBUGOUT("EEPROM Read Error\n");
1141 return -E1000_ERR_EEPROM;
1142 }
1143 if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 0)
Jeff Kirsher11241b12006-09-27 12:53:28 -07001144 hw->fc = E1000_FC_NONE;
Jeff Kirsherfd803242005-12-13 00:06:22 -05001145 else if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) ==
1146 EEPROM_WORD0F_ASM_DIR)
Jeff Kirsher11241b12006-09-27 12:53:28 -07001147 hw->fc = E1000_FC_TX_PAUSE;
Jeff Kirsherfd803242005-12-13 00:06:22 -05001148 else
Jeff Kirsher11241b12006-09-27 12:53:28 -07001149 hw->fc = E1000_FC_FULL;
Jeff Kirsherfd803242005-12-13 00:06:22 -05001150 break;
1151 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 }
1153
1154 /* We want to save off the original Flow Control configuration just
1155 * in case we get disconnected and then reconnected into a different
1156 * hub or switch with different Flow Control capabilities.
1157 */
Auke Kok8fc897b2006-08-28 14:56:16 -07001158 if (hw->mac_type == e1000_82542_rev2_0)
Jeff Kirsher11241b12006-09-27 12:53:28 -07001159 hw->fc &= (~E1000_FC_TX_PAUSE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160
Auke Kok8fc897b2006-08-28 14:56:16 -07001161 if ((hw->mac_type < e1000_82543) && (hw->report_tx_early == 1))
Jeff Kirsher11241b12006-09-27 12:53:28 -07001162 hw->fc &= (~E1000_FC_RX_PAUSE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163
1164 hw->original_fc = hw->fc;
1165
1166 DEBUGOUT1("After fix-ups FlowControl is now = %x\n", hw->fc);
1167
1168 /* Take the 4 bits from EEPROM word 0x0F that determine the initial
1169 * polarity value for the SW controlled pins, and setup the
1170 * Extended Device Control reg with that info.
1171 * This is needed because one of the SW controlled pins is used for
1172 * signal detection. So this should be done before e1000_setup_pcs_link()
1173 * or e1000_phy_setup() is called.
1174 */
Jeff Kirsher497fce52006-03-02 18:18:20 -08001175 if (hw->mac_type == e1000_82543) {
Auke Kok8fc897b2006-08-28 14:56:16 -07001176 ret_val = e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG,
1177 1, &eeprom_data);
1178 if (ret_val) {
1179 DEBUGOUT("EEPROM Read Error\n");
1180 return -E1000_ERR_EEPROM;
1181 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 ctrl_ext = ((eeprom_data & EEPROM_WORD0F_SWPDIO_EXT) <<
1183 SWDPIO__EXT_SHIFT);
Joe Perches1dc32912008-07-11 15:17:08 -07001184 ew32(CTRL_EXT, ctrl_ext);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 }
1186
1187 /* Call the necessary subroutine to configure the link. */
1188 ret_val = (hw->media_type == e1000_media_type_copper) ?
1189 e1000_setup_copper_link(hw) :
1190 e1000_setup_fiber_serdes_link(hw);
1191
1192 /* Initialize the flow control address, type, and PAUSE timer
1193 * registers to their default values. This is done even if flow
1194 * control is disabled, because it does not hurt anything to
1195 * initialize these registers.
1196 */
1197 DEBUGOUT("Initializing the Flow Control address, type and timer regs\n");
1198
Auke Kokcd94dd02006-06-27 09:08:22 -07001199 /* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */
1200 if (hw->mac_type != e1000_ich8lan) {
Joe Perches1dc32912008-07-11 15:17:08 -07001201 ew32(FCT, FLOW_CONTROL_TYPE);
1202 ew32(FCAH, FLOW_CONTROL_ADDRESS_HIGH);
1203 ew32(FCAL, FLOW_CONTROL_ADDRESS_LOW);
Auke Kokcd94dd02006-06-27 09:08:22 -07001204 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001205
Joe Perches1dc32912008-07-11 15:17:08 -07001206 ew32(FCTTV, hw->fc_pause_time);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207
1208 /* Set the flow control receive threshold registers. Normally,
1209 * these registers will be set to a default threshold that may be
1210 * adjusted later by the driver's runtime code. However, if the
1211 * ability to transmit pause frames in not enabled, then these
1212 * registers will be set to 0.
1213 */
Jeff Kirsher11241b12006-09-27 12:53:28 -07001214 if (!(hw->fc & E1000_FC_TX_PAUSE)) {
Joe Perches1dc32912008-07-11 15:17:08 -07001215 ew32(FCRTL, 0);
1216 ew32(FCRTH, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217 } else {
1218 /* We need to set up the Receive Threshold high and low water marks
1219 * as well as (optionally) enabling the transmission of XON frames.
1220 */
Auke Kok8fc897b2006-08-28 14:56:16 -07001221 if (hw->fc_send_xon) {
Joe Perches1dc32912008-07-11 15:17:08 -07001222 ew32(FCRTL, (hw->fc_low_water | E1000_FCRTL_XONE));
1223 ew32(FCRTH, hw->fc_high_water);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 } else {
Joe Perches1dc32912008-07-11 15:17:08 -07001225 ew32(FCRTL, hw->fc_low_water);
1226 ew32(FCRTH, hw->fc_high_water);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227 }
1228 }
1229 return ret_val;
1230}
1231
1232/******************************************************************************
1233 * Sets up link for a fiber based or serdes based adapter
1234 *
1235 * hw - Struct containing variables accessed by shared code
1236 *
1237 * Manipulates Physical Coding Sublayer functions in order to configure
1238 * link. Assumes the hardware has been previously reset and the transmitter
1239 * and receiver are not enabled.
1240 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001241static s32 e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242{
Joe Perches406874a2008-04-03 10:06:32 -07001243 u32 ctrl;
1244 u32 status;
1245 u32 txcw = 0;
1246 u32 i;
1247 u32 signal = 0;
1248 s32 ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001249
1250 DEBUGFUNC("e1000_setup_fiber_serdes_link");
1251
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04001252 /* On 82571 and 82572 Fiber connections, SerDes loopback mode persists
1253 * until explicitly turned off or a power cycle is performed. A read to
1254 * the register does not indicate its status. Therefore, we ensure
1255 * loopback mode is disabled during initialization.
1256 */
1257 if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572)
Joe Perches1dc32912008-07-11 15:17:08 -07001258 ew32(SCTL, E1000_DISABLE_SERDES_LOOPBACK);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04001259
Jeff Kirsher09ae3e82006-09-27 12:53:51 -07001260 /* On adapters with a MAC newer than 82544, SWDP 1 will be
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 * set when the optics detect a signal. On older adapters, it will be
1262 * cleared when there is a signal. This applies to fiber media only.
Jeff Kirsher09ae3e82006-09-27 12:53:51 -07001263 * If we're on serdes media, adjust the output amplitude to value
1264 * set in the EEPROM.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 */
Joe Perches1dc32912008-07-11 15:17:08 -07001266 ctrl = er32(CTRL);
Auke Kok8fc897b2006-08-28 14:56:16 -07001267 if (hw->media_type == e1000_media_type_fiber)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0;
1269
1270 ret_val = e1000_adjust_serdes_amplitude(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001271 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272 return ret_val;
1273
1274 /* Take the link out of reset */
1275 ctrl &= ~(E1000_CTRL_LRST);
1276
1277 /* Adjust VCO speed to improve BER performance */
1278 ret_val = e1000_set_vco_speed(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001279 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280 return ret_val;
1281
1282 e1000_config_collision_dist(hw);
1283
1284 /* Check for a software override of the flow control settings, and setup
1285 * the device accordingly. If auto-negotiation is enabled, then software
1286 * will have to set the "PAUSE" bits to the correct value in the Tranmsit
1287 * Config Word Register (TXCW) and re-start auto-negotiation. However, if
1288 * auto-negotiation is disabled, then software will have to manually
1289 * configure the two flow control enable bits in the CTRL register.
1290 *
1291 * The possible values of the "fc" parameter are:
1292 * 0: Flow control is completely disabled
1293 * 1: Rx flow control is enabled (we can receive pause frames, but
1294 * not send pause frames).
1295 * 2: Tx flow control is enabled (we can send pause frames but we do
1296 * not support receiving pause frames).
1297 * 3: Both Rx and TX flow control (symmetric) are enabled.
1298 */
1299 switch (hw->fc) {
Jeff Kirsher11241b12006-09-27 12:53:28 -07001300 case E1000_FC_NONE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301 /* Flow control is completely disabled by a software over-ride. */
1302 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD);
1303 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07001304 case E1000_FC_RX_PAUSE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 /* RX Flow control is enabled and TX Flow control is disabled by a
1306 * software over-ride. Since there really isn't a way to advertise
1307 * that we are capable of RX Pause ONLY, we will advertise that we
1308 * support both symmetric and asymmetric RX PAUSE. Later, we will
1309 * disable the adapter's ability to send PAUSE frames.
1310 */
1311 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
1312 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07001313 case E1000_FC_TX_PAUSE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001314 /* TX Flow control is enabled, and RX Flow control is disabled, by a
1315 * software over-ride.
1316 */
1317 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR);
1318 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07001319 case E1000_FC_FULL:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320 /* Flow control (both RX and TX) is enabled by a software over-ride. */
1321 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
1322 break;
1323 default:
1324 DEBUGOUT("Flow control param set incorrectly\n");
1325 return -E1000_ERR_CONFIG;
1326 break;
1327 }
1328
1329 /* Since auto-negotiation is enabled, take the link out of reset (the link
1330 * will be in reset, because we previously reset the chip). This will
1331 * restart auto-negotiation. If auto-neogtiation is successful then the
1332 * link-up status bit will be set and the flow control enable bits (RFCE
1333 * and TFCE) will be set according to their negotiated value.
1334 */
1335 DEBUGOUT("Auto-negotiation enabled\n");
1336
Joe Perches1dc32912008-07-11 15:17:08 -07001337 ew32(TXCW, txcw);
1338 ew32(CTRL, ctrl);
1339 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340
1341 hw->txcw = txcw;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04001342 msleep(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
1344 /* If we have a signal (the cable is plugged in) then poll for a "Link-Up"
1345 * indication in the Device Status Register. Time-out if a link isn't
1346 * seen in 500 milliseconds seconds (Auto-negotiation should complete in
1347 * less than 500 milliseconds even if the other end is doing it in SW).
1348 * For internal serdes, we just assume a signal is present, then poll.
1349 */
Auke Kok8fc897b2006-08-28 14:56:16 -07001350 if (hw->media_type == e1000_media_type_internal_serdes ||
Joe Perches1dc32912008-07-11 15:17:08 -07001351 (er32(CTRL) & E1000_CTRL_SWDPIN1) == signal) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001352 DEBUGOUT("Looking for Link\n");
Auke Kok8fc897b2006-08-28 14:56:16 -07001353 for (i = 0; i < (LINK_UP_TIMEOUT / 10); i++) {
Jeff Garzikf8ec4732006-09-19 15:27:07 -04001354 msleep(10);
Joe Perches1dc32912008-07-11 15:17:08 -07001355 status = er32(STATUS);
Auke Kok8fc897b2006-08-28 14:56:16 -07001356 if (status & E1000_STATUS_LU) break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 }
Auke Kok8fc897b2006-08-28 14:56:16 -07001358 if (i == (LINK_UP_TIMEOUT / 10)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 DEBUGOUT("Never got a valid link from auto-neg!!!\n");
1360 hw->autoneg_failed = 1;
1361 /* AutoNeg failed to achieve a link, so we'll call
1362 * e1000_check_for_link. This routine will force the link up if
1363 * we detect a signal. This will allow us to communicate with
1364 * non-autonegotiating link partners.
1365 */
1366 ret_val = e1000_check_for_link(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001367 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368 DEBUGOUT("Error while checking for link\n");
1369 return ret_val;
1370 }
1371 hw->autoneg_failed = 0;
1372 } else {
1373 hw->autoneg_failed = 0;
1374 DEBUGOUT("Valid Link Found\n");
1375 }
1376 } else {
1377 DEBUGOUT("No Signal Detected\n");
1378 }
1379 return E1000_SUCCESS;
1380}
1381
1382/******************************************************************************
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001383* Make sure we have a valid PHY and change PHY mode before link setup.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001384*
1385* hw - Struct containing variables accessed by shared code
1386******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001387static s32 e1000_copper_link_preconfig(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388{
Joe Perches406874a2008-04-03 10:06:32 -07001389 u32 ctrl;
1390 s32 ret_val;
1391 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001393 DEBUGFUNC("e1000_copper_link_preconfig");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394
Joe Perches1dc32912008-07-11 15:17:08 -07001395 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 /* With 82543, we need to force speed and duplex on the MAC equal to what
1397 * the PHY speed and duplex configuration is. In addition, we need to
1398 * perform a hardware reset on the PHY to take it out of reset.
1399 */
Auke Kok8fc897b2006-08-28 14:56:16 -07001400 if (hw->mac_type > e1000_82543) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401 ctrl |= E1000_CTRL_SLU;
1402 ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
Joe Perches1dc32912008-07-11 15:17:08 -07001403 ew32(CTRL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 } else {
1405 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_SLU);
Joe Perches1dc32912008-07-11 15:17:08 -07001406 ew32(CTRL, ctrl);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001407 ret_val = e1000_phy_hw_reset(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001408 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001409 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410 }
1411
1412 /* Make sure we have a valid PHY */
1413 ret_val = e1000_detect_gig_phy(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001414 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415 DEBUGOUT("Error, did not detect valid phy.\n");
1416 return ret_val;
1417 }
1418 DEBUGOUT1("Phy ID = %x \n", hw->phy_id);
1419
1420 /* Set PHY to class A mode (if necessary) */
1421 ret_val = e1000_set_phy_mode(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001422 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 return ret_val;
1424
Auke Kok8fc897b2006-08-28 14:56:16 -07001425 if ((hw->mac_type == e1000_82545_rev_3) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426 (hw->mac_type == e1000_82546_rev_3)) {
1427 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
1428 phy_data |= 0x00000008;
1429 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
1430 }
1431
Auke Kok8fc897b2006-08-28 14:56:16 -07001432 if (hw->mac_type <= e1000_82543 ||
1433 hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547 ||
1434 hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2)
Joe Perchesc3033b02008-03-21 11:06:25 -07001435 hw->phy_reset_disable = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001437 return E1000_SUCCESS;
1438}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439
Linus Torvalds1da177e2005-04-16 15:20:36 -07001440
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001441/********************************************************************
1442* Copper link setup for e1000_phy_igp series.
1443*
1444* hw - Struct containing variables accessed by shared code
1445*********************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001446static s32 e1000_copper_link_igp_setup(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001447{
Joe Perches406874a2008-04-03 10:06:32 -07001448 u32 led_ctrl;
1449 s32 ret_val;
1450 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001452 DEBUGFUNC("e1000_copper_link_igp_setup");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001454 if (hw->phy_reset_disable)
1455 return E1000_SUCCESS;
Auke Kok76c224b2006-05-23 13:36:06 -07001456
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001457 ret_val = e1000_phy_reset(hw);
1458 if (ret_val) {
1459 DEBUGOUT("Error Resetting the PHY\n");
1460 return ret_val;
1461 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462
Auke Kok8fc897b2006-08-28 14:56:16 -07001463 /* Wait 15ms for MAC to configure PHY from eeprom settings */
Jeff Garzikf8ec4732006-09-19 15:27:07 -04001464 msleep(15);
Auke Kokcd94dd02006-06-27 09:08:22 -07001465 if (hw->mac_type != e1000_ich8lan) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001466 /* Configure activity LED after PHY reset */
Joe Perches1dc32912008-07-11 15:17:08 -07001467 led_ctrl = er32(LEDCTL);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001468 led_ctrl &= IGP_ACTIVITY_LED_MASK;
1469 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
Joe Perches1dc32912008-07-11 15:17:08 -07001470 ew32(LEDCTL, led_ctrl);
Auke Kokcd94dd02006-06-27 09:08:22 -07001471 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001472
Jeff Kirsherc9c1b832006-08-16 13:38:54 -07001473 /* The NVM settings will configure LPLU in D3 for IGP2 and IGP3 PHYs */
1474 if (hw->phy_type == e1000_phy_igp) {
1475 /* disable lplu d3 during driver init */
Joe Perchesc3033b02008-03-21 11:06:25 -07001476 ret_val = e1000_set_d3_lplu_state(hw, false);
Jeff Kirsherc9c1b832006-08-16 13:38:54 -07001477 if (ret_val) {
1478 DEBUGOUT("Error Disabling LPLU D3\n");
1479 return ret_val;
1480 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001481 }
1482
1483 /* disable lplu d0 during driver init */
Joe Perchesc3033b02008-03-21 11:06:25 -07001484 ret_val = e1000_set_d0_lplu_state(hw, false);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001485 if (ret_val) {
1486 DEBUGOUT("Error Disabling LPLU D0\n");
1487 return ret_val;
1488 }
1489 /* Configure mdi-mdix settings */
1490 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
1491 if (ret_val)
1492 return ret_val;
1493
1494 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
1495 hw->dsp_config_state = e1000_dsp_config_disabled;
1496 /* Force MDI for earlier revs of the IGP PHY */
1497 phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX | IGP01E1000_PSCR_FORCE_MDI_MDIX);
1498 hw->mdix = 1;
1499
1500 } else {
1501 hw->dsp_config_state = e1000_dsp_config_enabled;
1502 phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
1503
1504 switch (hw->mdix) {
1505 case 1:
1506 phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
1507 break;
1508 case 2:
1509 phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;
1510 break;
1511 case 0:
1512 default:
1513 phy_data |= IGP01E1000_PSCR_AUTO_MDIX;
1514 break;
1515 }
1516 }
1517 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001518 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001519 return ret_val;
1520
1521 /* set auto-master slave resolution settings */
Auke Kok8fc897b2006-08-28 14:56:16 -07001522 if (hw->autoneg) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001523 e1000_ms_type phy_ms_setting = hw->master_slave;
1524
Auke Kok8fc897b2006-08-28 14:56:16 -07001525 if (hw->ffe_config_state == e1000_ffe_config_active)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001526 hw->ffe_config_state = e1000_ffe_config_enabled;
1527
Auke Kok8fc897b2006-08-28 14:56:16 -07001528 if (hw->dsp_config_state == e1000_dsp_config_activated)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001529 hw->dsp_config_state = e1000_dsp_config_enabled;
1530
1531 /* when autonegotiation advertisment is only 1000Mbps then we
1532 * should disable SmartSpeed and enable Auto MasterSlave
1533 * resolution as hardware default. */
Auke Kok8fc897b2006-08-28 14:56:16 -07001534 if (hw->autoneg_advertised == ADVERTISE_1000_FULL) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001535 /* Disable SmartSpeed */
Auke Kok8fc897b2006-08-28 14:56:16 -07001536 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
1537 &phy_data);
1538 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539 return ret_val;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001540 phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
Auke Kok8fc897b2006-08-28 14:56:16 -07001541 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
1542 phy_data);
1543 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001544 return ret_val;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001545 /* Set auto Master/Slave resolution process */
1546 ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001547 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001548 return ret_val;
1549 phy_data &= ~CR_1000T_MS_ENABLE;
1550 ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001551 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001552 return ret_val;
1553 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001554
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001555 ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001556 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001557 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001559 /* load defaults for future use */
1560 hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ?
1561 ((phy_data & CR_1000T_MS_VALUE) ?
1562 e1000_ms_force_master :
1563 e1000_ms_force_slave) :
1564 e1000_ms_auto;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001565
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001566 switch (phy_ms_setting) {
1567 case e1000_ms_force_master:
1568 phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE);
1569 break;
1570 case e1000_ms_force_slave:
1571 phy_data |= CR_1000T_MS_ENABLE;
1572 phy_data &= ~(CR_1000T_MS_VALUE);
1573 break;
1574 case e1000_ms_auto:
1575 phy_data &= ~CR_1000T_MS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 default:
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001577 break;
1578 }
1579 ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001580 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001581 return ret_val;
Malli Chilakala2b028932005-06-17 17:46:06 -07001582 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583
Malli Chilakala2b028932005-06-17 17:46:06 -07001584 return E1000_SUCCESS;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001585}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001587/********************************************************************
1588* Copper link setup for e1000_phy_gg82563 series.
1589*
1590* hw - Struct containing variables accessed by shared code
1591*********************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001592static s32 e1000_copper_link_ggp_setup(struct e1000_hw *hw)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001593{
Joe Perches406874a2008-04-03 10:06:32 -07001594 s32 ret_val;
1595 u16 phy_data;
1596 u32 reg_data;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001597
1598 DEBUGFUNC("e1000_copper_link_ggp_setup");
1599
Auke Kok8fc897b2006-08-28 14:56:16 -07001600 if (!hw->phy_reset_disable) {
Auke Kok76c224b2006-05-23 13:36:06 -07001601
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001602 /* Enable CRS on TX for half-duplex operation. */
1603 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
1604 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001605 if (ret_val)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001606 return ret_val;
1607
1608 phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
1609 /* Use 25MHz for both link down and 1000BASE-T for Tx clock */
1610 phy_data |= GG82563_MSCR_TX_CLK_1000MBPS_25MHZ;
1611
1612 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
1613 phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001614 if (ret_val)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001615 return ret_val;
1616
1617 /* Options:
1618 * MDI/MDI-X = 0 (default)
1619 * 0 - Auto for all speeds
1620 * 1 - MDI mode
1621 * 2 - MDI-X mode
1622 * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
1623 */
1624 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001625 if (ret_val)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001626 return ret_val;
1627
1628 phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK;
1629
1630 switch (hw->mdix) {
1631 case 1:
1632 phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDI;
1633 break;
1634 case 2:
1635 phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDIX;
1636 break;
1637 case 0:
1638 default:
1639 phy_data |= GG82563_PSCR_CROSSOVER_MODE_AUTO;
1640 break;
1641 }
1642
1643 /* Options:
1644 * disable_polarity_correction = 0 (default)
1645 * Automatic Correction for Reversed Cable Polarity
1646 * 0 - Disabled
1647 * 1 - Enabled
1648 */
1649 phy_data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
Auke Kok8fc897b2006-08-28 14:56:16 -07001650 if (hw->disable_polarity_correction == 1)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001651 phy_data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
1652 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL, phy_data);
1653
Auke Kok8fc897b2006-08-28 14:56:16 -07001654 if (ret_val)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001655 return ret_val;
1656
1657 /* SW Reset the PHY so all changes take effect */
1658 ret_val = e1000_phy_reset(hw);
1659 if (ret_val) {
1660 DEBUGOUT("Error Resetting the PHY\n");
1661 return ret_val;
1662 }
1663 } /* phy_reset_disable */
1664
1665 if (hw->mac_type == e1000_80003es2lan) {
1666 /* Bypass RX and TX FIFO's */
1667 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL,
1668 E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS |
1669 E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
1670 if (ret_val)
1671 return ret_val;
1672
1673 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, &phy_data);
1674 if (ret_val)
1675 return ret_val;
1676
1677 phy_data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG;
1678 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, phy_data);
1679
1680 if (ret_val)
1681 return ret_val;
1682
Joe Perches1dc32912008-07-11 15:17:08 -07001683 reg_data = er32(CTRL_EXT);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001684 reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK);
Joe Perches1dc32912008-07-11 15:17:08 -07001685 ew32(CTRL_EXT, reg_data);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001686
1687 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
1688 &phy_data);
1689 if (ret_val)
1690 return ret_val;
1691
1692 /* Do not init these registers when the HW is in IAMT mode, since the
1693 * firmware will have already initialized them. We only initialize
1694 * them if the HW is not in IAMT mode.
1695 */
Joe Perchesc3033b02008-03-21 11:06:25 -07001696 if (!e1000_check_mng_mode(hw)) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001697 /* Enable Electrical Idle on the PHY */
1698 phy_data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE;
1699 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
1700 phy_data);
1701 if (ret_val)
1702 return ret_val;
1703
1704 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
1705 &phy_data);
1706 if (ret_val)
1707 return ret_val;
1708
Auke Kokcd94dd02006-06-27 09:08:22 -07001709 phy_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001710 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
1711 phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001712
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001713 if (ret_val)
1714 return ret_val;
1715 }
1716
1717 /* Workaround: Disable padding in Kumeran interface in the MAC
1718 * and in the PHY to avoid CRC errors.
1719 */
1720 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_INBAND_CTRL,
1721 &phy_data);
1722 if (ret_val)
1723 return ret_val;
1724 phy_data |= GG82563_ICR_DIS_PADDING;
1725 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_INBAND_CTRL,
1726 phy_data);
1727 if (ret_val)
1728 return ret_val;
1729 }
1730
1731 return E1000_SUCCESS;
1732}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001733
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001734/********************************************************************
1735* Copper link setup for e1000_phy_m88 series.
1736*
1737* hw - Struct containing variables accessed by shared code
1738*********************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001739static s32 e1000_copper_link_mgp_setup(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001740{
Joe Perches406874a2008-04-03 10:06:32 -07001741 s32 ret_val;
1742 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001744 DEBUGFUNC("e1000_copper_link_mgp_setup");
1745
Auke Kok8fc897b2006-08-28 14:56:16 -07001746 if (hw->phy_reset_disable)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001747 return E1000_SUCCESS;
Auke Kok76c224b2006-05-23 13:36:06 -07001748
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001749 /* Enable CRS on TX. This must be set for half-duplex operation. */
1750 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001751 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001752 return ret_val;
1753
1754 phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
1755
1756 /* Options:
1757 * MDI/MDI-X = 0 (default)
1758 * 0 - Auto for all speeds
1759 * 1 - MDI mode
1760 * 2 - MDI-X mode
1761 * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
1762 */
1763 phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
1764
1765 switch (hw->mdix) {
1766 case 1:
1767 phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;
1768 break;
1769 case 2:
1770 phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;
1771 break;
1772 case 3:
1773 phy_data |= M88E1000_PSCR_AUTO_X_1000T;
1774 break;
1775 case 0:
1776 default:
1777 phy_data |= M88E1000_PSCR_AUTO_X_MODE;
1778 break;
1779 }
1780
1781 /* Options:
1782 * disable_polarity_correction = 0 (default)
1783 * Automatic Correction for Reversed Cable Polarity
1784 * 0 - Disabled
1785 * 1 - Enabled
1786 */
1787 phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
Auke Kok8fc897b2006-08-28 14:56:16 -07001788 if (hw->disable_polarity_correction == 1)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001789 phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
Auke Kokee040222006-06-27 09:08:03 -07001790 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
1791 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001792 return ret_val;
1793
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001794 if (hw->phy_revision < M88E1011_I_REV_4) {
Auke Kokee040222006-06-27 09:08:03 -07001795 /* Force TX_CLK in the Extended PHY Specific Control Register
1796 * to 25MHz clock.
1797 */
1798 ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
1799 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001800 return ret_val;
Auke Kokee040222006-06-27 09:08:03 -07001801
1802 phy_data |= M88E1000_EPSCR_TX_CLK_25;
1803
1804 if ((hw->phy_revision == E1000_REVISION_2) &&
1805 (hw->phy_id == M88E1111_I_PHY_ID)) {
1806 /* Vidalia Phy, set the downshift counter to 5x */
1807 phy_data &= ~(M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK);
1808 phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X;
1809 ret_val = e1000_write_phy_reg(hw,
1810 M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
1811 if (ret_val)
1812 return ret_val;
1813 } else {
1814 /* Configure Master and Slave downshift values */
1815 phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |
1816 M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
1817 phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
1818 M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
1819 ret_val = e1000_write_phy_reg(hw,
1820 M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
1821 if (ret_val)
1822 return ret_val;
1823 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001824 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001825
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001826 /* SW Reset the PHY so all changes take effect */
1827 ret_val = e1000_phy_reset(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001828 if (ret_val) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001829 DEBUGOUT("Error Resetting the PHY\n");
1830 return ret_val;
1831 }
1832
1833 return E1000_SUCCESS;
1834}
1835
1836/********************************************************************
1837* Setup auto-negotiation and flow control advertisements,
1838* and then perform auto-negotiation.
1839*
1840* hw - Struct containing variables accessed by shared code
1841*********************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001842static s32 e1000_copper_link_autoneg(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001843{
Joe Perches406874a2008-04-03 10:06:32 -07001844 s32 ret_val;
1845 u16 phy_data;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001846
1847 DEBUGFUNC("e1000_copper_link_autoneg");
1848
1849 /* Perform some bounds checking on the hw->autoneg_advertised
1850 * parameter. If this variable is zero, then set it to the default.
1851 */
1852 hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT;
1853
1854 /* If autoneg_advertised is zero, we assume it was not defaulted
1855 * by the calling code so we set to advertise full capability.
1856 */
Auke Kok8fc897b2006-08-28 14:56:16 -07001857 if (hw->autoneg_advertised == 0)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001858 hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
1859
Auke Kokcd94dd02006-06-27 09:08:22 -07001860 /* IFE phy only supports 10/100 */
1861 if (hw->phy_type == e1000_phy_ife)
1862 hw->autoneg_advertised &= AUTONEG_ADVERTISE_10_100_ALL;
1863
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001864 DEBUGOUT("Reconfiguring auto-neg advertisement params\n");
1865 ret_val = e1000_phy_setup_autoneg(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001866 if (ret_val) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001867 DEBUGOUT("Error Setting up Auto-Negotiation\n");
1868 return ret_val;
1869 }
1870 DEBUGOUT("Restarting Auto-Neg\n");
1871
1872 /* Restart auto-negotiation by setting the Auto Neg Enable bit and
1873 * the Auto Neg Restart bit in the PHY control register.
1874 */
1875 ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001876 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001877 return ret_val;
1878
1879 phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
1880 ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07001881 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001882 return ret_val;
1883
1884 /* Does the user want to wait for Auto-Neg to complete here, or
1885 * check at a later time (for example, callback routine).
1886 */
Auke Kok8fc897b2006-08-28 14:56:16 -07001887 if (hw->wait_autoneg_complete) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001888 ret_val = e1000_wait_autoneg(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001889 if (ret_val) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001890 DEBUGOUT("Error while waiting for autoneg to complete\n");
1891 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001892 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001893 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001894
Joe Perchesc3033b02008-03-21 11:06:25 -07001895 hw->get_link_status = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001896
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001897 return E1000_SUCCESS;
1898}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001900/******************************************************************************
1901* Config the MAC and the PHY after link is up.
1902* 1) Set up the MAC to the current PHY speed/duplex
1903* if we are on 82543. If we
1904* are on newer silicon, we only need to configure
1905* collision distance in the Transmit Control Register.
1906* 2) Set up flow control on the MAC to that established with
1907* the link partner.
Auke Kok76c224b2006-05-23 13:36:06 -07001908* 3) Config DSP to improve Gigabit link quality for some PHY revisions.
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001909*
1910* hw - Struct containing variables accessed by shared code
1911******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001912static s32 e1000_copper_link_postconfig(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001913{
Joe Perches406874a2008-04-03 10:06:32 -07001914 s32 ret_val;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001915 DEBUGFUNC("e1000_copper_link_postconfig");
Auke Kok76c224b2006-05-23 13:36:06 -07001916
Auke Kok8fc897b2006-08-28 14:56:16 -07001917 if (hw->mac_type >= e1000_82544) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001918 e1000_config_collision_dist(hw);
1919 } else {
1920 ret_val = e1000_config_mac_to_phy(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001921 if (ret_val) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001922 DEBUGOUT("Error configuring MAC to PHY settings\n");
1923 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001925 }
1926 ret_val = e1000_config_fc_after_link_up(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001927 if (ret_val) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001928 DEBUGOUT("Error Configuring Flow Control\n");
1929 return ret_val;
1930 }
1931
1932 /* Config DSP to improve Giga link quality */
Auke Kok8fc897b2006-08-28 14:56:16 -07001933 if (hw->phy_type == e1000_phy_igp) {
Joe Perchesc3033b02008-03-21 11:06:25 -07001934 ret_val = e1000_config_dsp_after_link_change(hw, true);
Auke Kok8fc897b2006-08-28 14:56:16 -07001935 if (ret_val) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001936 DEBUGOUT("Error Configuring DSP after link up\n");
1937 return ret_val;
1938 }
1939 }
Auke Kok76c224b2006-05-23 13:36:06 -07001940
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001941 return E1000_SUCCESS;
1942}
1943
1944/******************************************************************************
1945* Detects which PHY is present and setup the speed and duplex
1946*
1947* hw - Struct containing variables accessed by shared code
1948******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07001949static s32 e1000_setup_copper_link(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001950{
Joe Perches406874a2008-04-03 10:06:32 -07001951 s32 ret_val;
1952 u16 i;
1953 u16 phy_data;
1954 u16 reg_data;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001955
1956 DEBUGFUNC("e1000_setup_copper_link");
1957
Auke Kokcd94dd02006-06-27 09:08:22 -07001958 switch (hw->mac_type) {
1959 case e1000_80003es2lan:
1960 case e1000_ich8lan:
1961 /* Set the mac to wait the maximum time between each
1962 * iteration and increase the max iterations when
1963 * polling the phy; this fixes erroneous timeouts at 10Mbps. */
1964 ret_val = e1000_write_kmrn_reg(hw, GG82563_REG(0x34, 4), 0xFFFF);
1965 if (ret_val)
1966 return ret_val;
1967 ret_val = e1000_read_kmrn_reg(hw, GG82563_REG(0x34, 9), &reg_data);
1968 if (ret_val)
1969 return ret_val;
1970 reg_data |= 0x3F;
1971 ret_val = e1000_write_kmrn_reg(hw, GG82563_REG(0x34, 9), reg_data);
1972 if (ret_val)
1973 return ret_val;
1974 default:
1975 break;
1976 }
1977
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001978 /* Check if it is a valid PHY and set PHY mode if necessary. */
1979 ret_val = e1000_copper_link_preconfig(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07001980 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001981 return ret_val;
1982
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001983 switch (hw->mac_type) {
1984 case e1000_80003es2lan:
Auke Kokcd94dd02006-06-27 09:08:22 -07001985 /* Kumeran registers are written-only */
1986 reg_data = E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08001987 reg_data |= E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING;
1988 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_INB_CTRL,
1989 reg_data);
1990 if (ret_val)
1991 return ret_val;
1992 break;
1993 default:
1994 break;
1995 }
1996
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001997 if (hw->phy_type == e1000_phy_igp ||
Auke Kokcd94dd02006-06-27 09:08:22 -07001998 hw->phy_type == e1000_phy_igp_3 ||
Malli Chilakala2d7edb92005-04-28 19:43:52 -07001999 hw->phy_type == e1000_phy_igp_2) {
2000 ret_val = e1000_copper_link_igp_setup(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002001 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002002 return ret_val;
2003 } else if (hw->phy_type == e1000_phy_m88) {
2004 ret_val = e1000_copper_link_mgp_setup(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002005 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002006 return ret_val;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002007 } else if (hw->phy_type == e1000_phy_gg82563) {
2008 ret_val = e1000_copper_link_ggp_setup(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002009 if (ret_val)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002010 return ret_val;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002011 }
2012
Auke Kok8fc897b2006-08-28 14:56:16 -07002013 if (hw->autoneg) {
Auke Kok76c224b2006-05-23 13:36:06 -07002014 /* Setup autoneg and flow control advertisement
2015 * and perform autonegotiation */
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002016 ret_val = e1000_copper_link_autoneg(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002017 if (ret_val)
Auke Kok76c224b2006-05-23 13:36:06 -07002018 return ret_val;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002019 } else {
2020 /* PHY will be set to 10H, 10F, 100H,or 100F
2021 * depending on value from forced_speed_duplex. */
2022 DEBUGOUT("Forcing speed and duplex\n");
2023 ret_val = e1000_phy_force_speed_duplex(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002024 if (ret_val) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002025 DEBUGOUT("Error Forcing Speed and Duplex\n");
2026 return ret_val;
2027 }
2028 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029
2030 /* Check link status. Wait up to 100 microseconds for link to become
2031 * valid.
2032 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002033 for (i = 0; i < 10; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002034 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002035 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036 return ret_val;
2037 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002038 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039 return ret_val;
2040
Auke Kok8fc897b2006-08-28 14:56:16 -07002041 if (phy_data & MII_SR_LINK_STATUS) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002042 /* Config the MAC and PHY after link is up */
2043 ret_val = e1000_copper_link_postconfig(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002044 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045 return ret_val;
Auke Kok76c224b2006-05-23 13:36:06 -07002046
Linus Torvalds1da177e2005-04-16 15:20:36 -07002047 DEBUGOUT("Valid link established!!!\n");
2048 return E1000_SUCCESS;
2049 }
2050 udelay(10);
2051 }
2052
2053 DEBUGOUT("Unable to establish link!!!\n");
2054 return E1000_SUCCESS;
2055}
2056
2057/******************************************************************************
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002058* Configure the MAC-to-PHY interface for 10/100Mbps
2059*
2060* hw - Struct containing variables accessed by shared code
2061******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002062static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002063{
Joe Perches406874a2008-04-03 10:06:32 -07002064 s32 ret_val = E1000_SUCCESS;
2065 u32 tipg;
2066 u16 reg_data;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002067
2068 DEBUGFUNC("e1000_configure_kmrn_for_10_100");
2069
2070 reg_data = E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT;
2071 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL,
2072 reg_data);
2073 if (ret_val)
2074 return ret_val;
2075
2076 /* Configure Transmit Inter-Packet Gap */
Joe Perches1dc32912008-07-11 15:17:08 -07002077 tipg = er32(TIPG);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002078 tipg &= ~E1000_TIPG_IPGT_MASK;
2079 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100;
Joe Perches1dc32912008-07-11 15:17:08 -07002080 ew32(TIPG, tipg);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002081
Auke Kokcd94dd02006-06-27 09:08:22 -07002082 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
2083
2084 if (ret_val)
2085 return ret_val;
2086
2087 if (duplex == HALF_DUPLEX)
2088 reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER;
2089 else
2090 reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
2091
2092 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
2093
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002094 return ret_val;
2095}
2096
Joe Perches64798842008-07-11 15:17:02 -07002097static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002098{
Joe Perches406874a2008-04-03 10:06:32 -07002099 s32 ret_val = E1000_SUCCESS;
2100 u16 reg_data;
2101 u32 tipg;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002102
2103 DEBUGFUNC("e1000_configure_kmrn_for_1000");
2104
2105 reg_data = E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT;
2106 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL,
2107 reg_data);
2108 if (ret_val)
2109 return ret_val;
2110
2111 /* Configure Transmit Inter-Packet Gap */
Joe Perches1dc32912008-07-11 15:17:08 -07002112 tipg = er32(TIPG);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002113 tipg &= ~E1000_TIPG_IPGT_MASK;
2114 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
Joe Perches1dc32912008-07-11 15:17:08 -07002115 ew32(TIPG, tipg);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002116
Auke Kokcd94dd02006-06-27 09:08:22 -07002117 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, &reg_data);
2118
2119 if (ret_val)
2120 return ret_val;
2121
2122 reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
2123 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
2124
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002125 return ret_val;
2126}
2127
2128/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129* Configures PHY autoneg and flow control advertisement settings
2130*
2131* hw - Struct containing variables accessed by shared code
2132******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002133s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134{
Joe Perches406874a2008-04-03 10:06:32 -07002135 s32 ret_val;
2136 u16 mii_autoneg_adv_reg;
2137 u16 mii_1000t_ctrl_reg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138
2139 DEBUGFUNC("e1000_phy_setup_autoneg");
2140
2141 /* Read the MII Auto-Neg Advertisement Register (Address 4). */
2142 ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002143 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144 return ret_val;
2145
Auke Kokcd94dd02006-06-27 09:08:22 -07002146 if (hw->phy_type != e1000_phy_ife) {
2147 /* Read the MII 1000Base-T Control Register (Address 9). */
2148 ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
2149 if (ret_val)
2150 return ret_val;
2151 } else
2152 mii_1000t_ctrl_reg=0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002153
2154 /* Need to parse both autoneg_advertised and fc and set up
2155 * the appropriate PHY registers. First we will parse for
2156 * autoneg_advertised software override. Since we can advertise
2157 * a plethora of combinations, we need to check each bit
2158 * individually.
2159 */
2160
2161 /* First we clear all the 10/100 mb speed bits in the Auto-Neg
2162 * Advertisement Register (Address 4) and the 1000 mb speed bits in
2163 * the 1000Base-T Control Register (Address 9).
2164 */
2165 mii_autoneg_adv_reg &= ~REG4_SPEED_MASK;
2166 mii_1000t_ctrl_reg &= ~REG9_SPEED_MASK;
2167
2168 DEBUGOUT1("autoneg_advertised %x\n", hw->autoneg_advertised);
2169
2170 /* Do we want to advertise 10 Mb Half Duplex? */
Auke Kok8fc897b2006-08-28 14:56:16 -07002171 if (hw->autoneg_advertised & ADVERTISE_10_HALF) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172 DEBUGOUT("Advertise 10mb Half duplex\n");
2173 mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS;
2174 }
2175
2176 /* Do we want to advertise 10 Mb Full Duplex? */
Auke Kok8fc897b2006-08-28 14:56:16 -07002177 if (hw->autoneg_advertised & ADVERTISE_10_FULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178 DEBUGOUT("Advertise 10mb Full duplex\n");
2179 mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS;
2180 }
2181
2182 /* Do we want to advertise 100 Mb Half Duplex? */
Auke Kok8fc897b2006-08-28 14:56:16 -07002183 if (hw->autoneg_advertised & ADVERTISE_100_HALF) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002184 DEBUGOUT("Advertise 100mb Half duplex\n");
2185 mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS;
2186 }
2187
2188 /* Do we want to advertise 100 Mb Full Duplex? */
Auke Kok8fc897b2006-08-28 14:56:16 -07002189 if (hw->autoneg_advertised & ADVERTISE_100_FULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002190 DEBUGOUT("Advertise 100mb Full duplex\n");
2191 mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS;
2192 }
2193
2194 /* We do not allow the Phy to advertise 1000 Mb Half Duplex */
Auke Kok8fc897b2006-08-28 14:56:16 -07002195 if (hw->autoneg_advertised & ADVERTISE_1000_HALF) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002196 DEBUGOUT("Advertise 1000mb Half duplex requested, request denied!\n");
2197 }
2198
2199 /* Do we want to advertise 1000 Mb Full Duplex? */
Auke Kok8fc897b2006-08-28 14:56:16 -07002200 if (hw->autoneg_advertised & ADVERTISE_1000_FULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 DEBUGOUT("Advertise 1000mb Full duplex\n");
2202 mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS;
Auke Kokcd94dd02006-06-27 09:08:22 -07002203 if (hw->phy_type == e1000_phy_ife) {
2204 DEBUGOUT("e1000_phy_ife is a 10/100 PHY. Gigabit speed is not supported.\n");
2205 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 }
2207
2208 /* Check for a software override of the flow control settings, and
2209 * setup the PHY advertisement registers accordingly. If
2210 * auto-negotiation is enabled, then software will have to set the
2211 * "PAUSE" bits to the correct value in the Auto-Negotiation
2212 * Advertisement Register (PHY_AUTONEG_ADV) and re-start auto-negotiation.
2213 *
2214 * The possible values of the "fc" parameter are:
2215 * 0: Flow control is completely disabled
2216 * 1: Rx flow control is enabled (we can receive pause frames
2217 * but not send pause frames).
2218 * 2: Tx flow control is enabled (we can send pause frames
2219 * but we do not support receiving pause frames).
2220 * 3: Both Rx and TX flow control (symmetric) are enabled.
2221 * other: No software override. The flow control configuration
2222 * in the EEPROM is used.
2223 */
2224 switch (hw->fc) {
Jeff Kirsher11241b12006-09-27 12:53:28 -07002225 case E1000_FC_NONE: /* 0 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226 /* Flow control (RX & TX) is completely disabled by a
2227 * software over-ride.
2228 */
2229 mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
2230 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07002231 case E1000_FC_RX_PAUSE: /* 1 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232 /* RX Flow control is enabled, and TX Flow control is
2233 * disabled, by a software over-ride.
2234 */
2235 /* Since there really isn't a way to advertise that we are
2236 * capable of RX Pause ONLY, we will advertise that we
2237 * support both symmetric and asymmetric RX PAUSE. Later
2238 * (in e1000_config_fc_after_link_up) we will disable the
2239 *hw's ability to send PAUSE frames.
2240 */
2241 mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
2242 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07002243 case E1000_FC_TX_PAUSE: /* 2 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002244 /* TX Flow control is enabled, and RX Flow control is
2245 * disabled, by a software over-ride.
2246 */
2247 mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR;
2248 mii_autoneg_adv_reg &= ~NWAY_AR_PAUSE;
2249 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07002250 case E1000_FC_FULL: /* 3 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251 /* Flow control (both RX and TX) is enabled by a software
2252 * over-ride.
2253 */
2254 mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
2255 break;
2256 default:
2257 DEBUGOUT("Flow control param set incorrectly\n");
2258 return -E1000_ERR_CONFIG;
2259 }
2260
2261 ret_val = e1000_write_phy_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002262 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002263 return ret_val;
2264
2265 DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
2266
Auke Kokcd94dd02006-06-27 09:08:22 -07002267 if (hw->phy_type != e1000_phy_ife) {
2268 ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
2269 if (ret_val)
2270 return ret_val;
2271 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002272
2273 return E1000_SUCCESS;
2274}
2275
2276/******************************************************************************
2277* Force PHY speed and duplex settings to hw->forced_speed_duplex
2278*
2279* hw - Struct containing variables accessed by shared code
2280******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002281static s32 e1000_phy_force_speed_duplex(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002282{
Joe Perches406874a2008-04-03 10:06:32 -07002283 u32 ctrl;
2284 s32 ret_val;
2285 u16 mii_ctrl_reg;
2286 u16 mii_status_reg;
2287 u16 phy_data;
2288 u16 i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002289
2290 DEBUGFUNC("e1000_phy_force_speed_duplex");
2291
2292 /* Turn off Flow control if we are forcing speed and duplex. */
Jeff Kirsher11241b12006-09-27 12:53:28 -07002293 hw->fc = E1000_FC_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294
2295 DEBUGOUT1("hw->fc = %d\n", hw->fc);
2296
2297 /* Read the Device Control Register. */
Joe Perches1dc32912008-07-11 15:17:08 -07002298 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299
2300 /* Set the bits to Force Speed and Duplex in the Device Ctrl Reg. */
2301 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
2302 ctrl &= ~(DEVICE_SPEED_MASK);
2303
2304 /* Clear the Auto Speed Detect Enable bit. */
2305 ctrl &= ~E1000_CTRL_ASDE;
2306
2307 /* Read the MII Control Register. */
2308 ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002309 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 return ret_val;
2311
2312 /* We need to disable autoneg in order to force link and duplex. */
2313
2314 mii_ctrl_reg &= ~MII_CR_AUTO_NEG_EN;
2315
2316 /* Are we forcing Full or Half Duplex? */
Auke Kok8fc897b2006-08-28 14:56:16 -07002317 if (hw->forced_speed_duplex == e1000_100_full ||
2318 hw->forced_speed_duplex == e1000_10_full) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 /* We want to force full duplex so we SET the full duplex bits in the
2320 * Device and MII Control Registers.
2321 */
2322 ctrl |= E1000_CTRL_FD;
2323 mii_ctrl_reg |= MII_CR_FULL_DUPLEX;
2324 DEBUGOUT("Full Duplex\n");
2325 } else {
2326 /* We want to force half duplex so we CLEAR the full duplex bits in
2327 * the Device and MII Control Registers.
2328 */
2329 ctrl &= ~E1000_CTRL_FD;
2330 mii_ctrl_reg &= ~MII_CR_FULL_DUPLEX;
2331 DEBUGOUT("Half Duplex\n");
2332 }
2333
2334 /* Are we forcing 100Mbps??? */
Auke Kok8fc897b2006-08-28 14:56:16 -07002335 if (hw->forced_speed_duplex == e1000_100_full ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002336 hw->forced_speed_duplex == e1000_100_half) {
2337 /* Set the 100Mb bit and turn off the 1000Mb and 10Mb bits. */
2338 ctrl |= E1000_CTRL_SPD_100;
2339 mii_ctrl_reg |= MII_CR_SPEED_100;
2340 mii_ctrl_reg &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_10);
2341 DEBUGOUT("Forcing 100mb ");
2342 } else {
2343 /* Set the 10Mb bit and turn off the 1000Mb and 100Mb bits. */
2344 ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
2345 mii_ctrl_reg |= MII_CR_SPEED_10;
2346 mii_ctrl_reg &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_100);
2347 DEBUGOUT("Forcing 10mb ");
2348 }
2349
2350 e1000_config_collision_dist(hw);
2351
2352 /* Write the configured values back to the Device Control Reg. */
Joe Perches1dc32912008-07-11 15:17:08 -07002353 ew32(CTRL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002354
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002355 if ((hw->phy_type == e1000_phy_m88) ||
2356 (hw->phy_type == e1000_phy_gg82563)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002358 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359 return ret_val;
2360
2361 /* Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI
2362 * forced whenever speed are duplex are forced.
2363 */
2364 phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
2365 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002366 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002367 return ret_val;
2368
2369 DEBUGOUT1("M88E1000 PSCR: %x \n", phy_data);
2370
2371 /* Need to reset the PHY or these changes will be ignored */
2372 mii_ctrl_reg |= MII_CR_RESET;
Auke Kok90fb5132006-11-01 08:47:30 -08002373
Auke Kokcd94dd02006-06-27 09:08:22 -07002374 /* Disable MDI-X support for 10/100 */
2375 } else if (hw->phy_type == e1000_phy_ife) {
2376 ret_val = e1000_read_phy_reg(hw, IFE_PHY_MDIX_CONTROL, &phy_data);
2377 if (ret_val)
2378 return ret_val;
2379
2380 phy_data &= ~IFE_PMC_AUTO_MDIX;
2381 phy_data &= ~IFE_PMC_FORCE_MDIX;
2382
2383 ret_val = e1000_write_phy_reg(hw, IFE_PHY_MDIX_CONTROL, phy_data);
2384 if (ret_val)
2385 return ret_val;
Auke Kok90fb5132006-11-01 08:47:30 -08002386
Linus Torvalds1da177e2005-04-16 15:20:36 -07002387 } else {
2388 /* Clear Auto-Crossover to force MDI manually. IGP requires MDI
2389 * forced whenever speed or duplex are forced.
2390 */
2391 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002392 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002393 return ret_val;
2394
2395 phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
2396 phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
2397
2398 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002399 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002400 return ret_val;
2401 }
2402
2403 /* Write back the modified PHY MII control register. */
2404 ret_val = e1000_write_phy_reg(hw, PHY_CTRL, mii_ctrl_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002405 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406 return ret_val;
2407
2408 udelay(1);
2409
2410 /* The wait_autoneg_complete flag may be a little misleading here.
2411 * Since we are forcing speed and duplex, Auto-Neg is not enabled.
2412 * But we do want to delay for a period while forcing only so we
2413 * don't generate false No Link messages. So we will wait here
2414 * only if the user has set wait_autoneg_complete to 1, which is
2415 * the default.
2416 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002417 if (hw->wait_autoneg_complete) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002418 /* We will wait for autoneg to complete. */
2419 DEBUGOUT("Waiting for forced speed/duplex link.\n");
2420 mii_status_reg = 0;
2421
2422 /* We will wait for autoneg to complete or 4.5 seconds to expire. */
Auke Kok8fc897b2006-08-28 14:56:16 -07002423 for (i = PHY_FORCE_TIME; i > 0; i--) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002424 /* Read the MII Status Register and wait for Auto-Neg Complete bit
2425 * to be set.
2426 */
2427 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002428 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002429 return ret_val;
2430
2431 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002432 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002433 return ret_val;
2434
Auke Kok8fc897b2006-08-28 14:56:16 -07002435 if (mii_status_reg & MII_SR_LINK_STATUS) break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04002436 msleep(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002437 }
Auke Kok8fc897b2006-08-28 14:56:16 -07002438 if ((i == 0) &&
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002439 ((hw->phy_type == e1000_phy_m88) ||
2440 (hw->phy_type == e1000_phy_gg82563))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441 /* We didn't get link. Reset the DSP and wait again for link. */
2442 ret_val = e1000_phy_reset_dsp(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002443 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002444 DEBUGOUT("Error Resetting PHY DSP\n");
2445 return ret_val;
2446 }
2447 }
2448 /* This loop will early-out if the link condition has been met. */
Auke Kok8fc897b2006-08-28 14:56:16 -07002449 for (i = PHY_FORCE_TIME; i > 0; i--) {
2450 if (mii_status_reg & MII_SR_LINK_STATUS) break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04002451 msleep(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002452 /* Read the MII Status Register and wait for Auto-Neg Complete bit
2453 * to be set.
2454 */
2455 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002456 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002457 return ret_val;
2458
2459 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002460 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002461 return ret_val;
2462 }
2463 }
2464
2465 if (hw->phy_type == e1000_phy_m88) {
2466 /* Because we reset the PHY above, we need to re-force TX_CLK in the
2467 * Extended PHY Specific Control Register to 25MHz clock. This value
2468 * defaults back to a 2.5MHz clock when the PHY is reset.
2469 */
2470 ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002471 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002472 return ret_val;
2473
2474 phy_data |= M88E1000_EPSCR_TX_CLK_25;
2475 ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002476 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002477 return ret_val;
2478
2479 /* In addition, because of the s/w reset above, we need to enable CRS on
2480 * TX. This must be set for both full and half duplex operation.
2481 */
2482 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002483 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002484 return ret_val;
2485
2486 phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
2487 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002488 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002489 return ret_val;
2490
Auke Kok8fc897b2006-08-28 14:56:16 -07002491 if ((hw->mac_type == e1000_82544 || hw->mac_type == e1000_82543) &&
2492 (!hw->autoneg) && (hw->forced_speed_duplex == e1000_10_full ||
2493 hw->forced_speed_duplex == e1000_10_half)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002494 ret_val = e1000_polarity_reversal_workaround(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002495 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002496 return ret_val;
2497 }
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08002498 } else if (hw->phy_type == e1000_phy_gg82563) {
2499 /* The TX_CLK of the Extended PHY Specific Control Register defaults
2500 * to 2.5MHz on a reset. We need to re-force it back to 25MHz, if
2501 * we're not in a forced 10/duplex configuration. */
2502 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data);
2503 if (ret_val)
2504 return ret_val;
2505
2506 phy_data &= ~GG82563_MSCR_TX_CLK_MASK;
2507 if ((hw->forced_speed_duplex == e1000_10_full) ||
2508 (hw->forced_speed_duplex == e1000_10_half))
2509 phy_data |= GG82563_MSCR_TX_CLK_10MBPS_2_5MHZ;
2510 else
2511 phy_data |= GG82563_MSCR_TX_CLK_100MBPS_25MHZ;
2512
2513 /* Also due to the reset, we need to enable CRS on Tx. */
2514 phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
2515
2516 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, phy_data);
2517 if (ret_val)
2518 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002519 }
2520 return E1000_SUCCESS;
2521}
2522
2523/******************************************************************************
2524* Sets the collision distance in the Transmit Control register
2525*
2526* hw - Struct containing variables accessed by shared code
2527*
2528* Link should have been established previously. Reads the speed and duplex
2529* information from the Device Status register.
2530******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002531void e1000_config_collision_dist(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002532{
Joe Perches406874a2008-04-03 10:06:32 -07002533 u32 tctl, coll_dist;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534
2535 DEBUGFUNC("e1000_config_collision_dist");
2536
Jeff Kirsher0fadb052006-01-12 16:51:05 -08002537 if (hw->mac_type < e1000_82543)
2538 coll_dist = E1000_COLLISION_DISTANCE_82542;
2539 else
2540 coll_dist = E1000_COLLISION_DISTANCE;
2541
Joe Perches1dc32912008-07-11 15:17:08 -07002542 tctl = er32(TCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002543
2544 tctl &= ~E1000_TCTL_COLD;
Jeff Kirsher0fadb052006-01-12 16:51:05 -08002545 tctl |= coll_dist << E1000_COLD_SHIFT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002546
Joe Perches1dc32912008-07-11 15:17:08 -07002547 ew32(TCTL, tctl);
2548 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002549}
2550
2551/******************************************************************************
2552* Sets MAC speed and duplex settings to reflect the those in the PHY
2553*
2554* hw - Struct containing variables accessed by shared code
2555* mii_reg - data to write to the MII control register
2556*
2557* The contents of the PHY register containing the needed information need to
2558* be passed in.
2559******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002560static s32 e1000_config_mac_to_phy(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002561{
Joe Perches406874a2008-04-03 10:06:32 -07002562 u32 ctrl;
2563 s32 ret_val;
2564 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002565
2566 DEBUGFUNC("e1000_config_mac_to_phy");
2567
Auke Kok76c224b2006-05-23 13:36:06 -07002568 /* 82544 or newer MAC, Auto Speed Detection takes care of
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002569 * MAC speed/duplex configuration.*/
2570 if (hw->mac_type >= e1000_82544)
2571 return E1000_SUCCESS;
2572
Linus Torvalds1da177e2005-04-16 15:20:36 -07002573 /* Read the Device Control Register and set the bits to Force Speed
2574 * and Duplex.
2575 */
Joe Perches1dc32912008-07-11 15:17:08 -07002576 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002577 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
2578 ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS);
2579
2580 /* Set up duplex in the Device Control and Transmit Control
2581 * registers depending on negotiated values.
2582 */
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002583 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002584 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002585 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002586
Auke Kok8fc897b2006-08-28 14:56:16 -07002587 if (phy_data & M88E1000_PSSR_DPLX)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002588 ctrl |= E1000_CTRL_FD;
Auke Kok76c224b2006-05-23 13:36:06 -07002589 else
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002590 ctrl &= ~E1000_CTRL_FD;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002591
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002592 e1000_config_collision_dist(hw);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002593
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002594 /* Set up speed in the Device Control register depending on
2595 * negotiated values.
2596 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002597 if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002598 ctrl |= E1000_CTRL_SPD_1000;
Auke Kok8fc897b2006-08-28 14:56:16 -07002599 else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07002600 ctrl |= E1000_CTRL_SPD_100;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002601
Linus Torvalds1da177e2005-04-16 15:20:36 -07002602 /* Write the configured values back to the Device Control Reg. */
Joe Perches1dc32912008-07-11 15:17:08 -07002603 ew32(CTRL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002604 return E1000_SUCCESS;
2605}
2606
2607/******************************************************************************
2608 * Forces the MAC's flow control settings.
2609 *
2610 * hw - Struct containing variables accessed by shared code
2611 *
2612 * Sets the TFCE and RFCE bits in the device control register to reflect
2613 * the adapter settings. TFCE and RFCE need to be explicitly set by
2614 * software when a Copper PHY is used because autonegotiation is managed
2615 * by the PHY rather than the MAC. Software must also configure these
2616 * bits when link is forced on a fiber connection.
2617 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002618s32 e1000_force_mac_fc(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002619{
Joe Perches406874a2008-04-03 10:06:32 -07002620 u32 ctrl;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002621
2622 DEBUGFUNC("e1000_force_mac_fc");
2623
2624 /* Get the current configuration of the Device Control Register */
Joe Perches1dc32912008-07-11 15:17:08 -07002625 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002626
2627 /* Because we didn't get link via the internal auto-negotiation
2628 * mechanism (we either forced link or we got link via PHY
2629 * auto-neg), we have to manually enable/disable transmit an
2630 * receive flow control.
2631 *
2632 * The "Case" statement below enables/disable flow control
2633 * according to the "hw->fc" parameter.
2634 *
2635 * The possible values of the "fc" parameter are:
2636 * 0: Flow control is completely disabled
2637 * 1: Rx flow control is enabled (we can receive pause
2638 * frames but not send pause frames).
2639 * 2: Tx flow control is enabled (we can send pause frames
2640 * frames but we do not receive pause frames).
2641 * 3: Both Rx and TX flow control (symmetric) is enabled.
2642 * other: No other values should be possible at this point.
2643 */
2644
2645 switch (hw->fc) {
Jeff Kirsher11241b12006-09-27 12:53:28 -07002646 case E1000_FC_NONE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002647 ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE));
2648 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07002649 case E1000_FC_RX_PAUSE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002650 ctrl &= (~E1000_CTRL_TFCE);
2651 ctrl |= E1000_CTRL_RFCE;
2652 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07002653 case E1000_FC_TX_PAUSE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002654 ctrl &= (~E1000_CTRL_RFCE);
2655 ctrl |= E1000_CTRL_TFCE;
2656 break;
Jeff Kirsher11241b12006-09-27 12:53:28 -07002657 case E1000_FC_FULL:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002658 ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE);
2659 break;
2660 default:
2661 DEBUGOUT("Flow control param set incorrectly\n");
2662 return -E1000_ERR_CONFIG;
2663 }
2664
2665 /* Disable TX Flow Control for 82542 (rev 2.0) */
Auke Kok8fc897b2006-08-28 14:56:16 -07002666 if (hw->mac_type == e1000_82542_rev2_0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002667 ctrl &= (~E1000_CTRL_TFCE);
2668
Joe Perches1dc32912008-07-11 15:17:08 -07002669 ew32(CTRL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002670 return E1000_SUCCESS;
2671}
2672
2673/******************************************************************************
2674 * Configures flow control settings after link is established
2675 *
2676 * hw - Struct containing variables accessed by shared code
2677 *
2678 * Should be called immediately after a valid link has been established.
2679 * Forces MAC flow control settings if link was forced. When in MII/GMII mode
2680 * and autonegotiation is enabled, the MAC flow control settings will be set
2681 * based on the flow control negotiated by the PHY. In TBI mode, the TFCE
2682 * and RFCE bits will be automaticaly set to the negotiated flow control mode.
2683 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002684static s32 e1000_config_fc_after_link_up(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002685{
Joe Perches406874a2008-04-03 10:06:32 -07002686 s32 ret_val;
2687 u16 mii_status_reg;
2688 u16 mii_nway_adv_reg;
2689 u16 mii_nway_lp_ability_reg;
2690 u16 speed;
2691 u16 duplex;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002692
2693 DEBUGFUNC("e1000_config_fc_after_link_up");
2694
2695 /* Check for the case where we have fiber media and auto-neg failed
2696 * so we had to force link. In this case, we need to force the
2697 * configuration of the MAC to match the "fc" parameter.
2698 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002699 if (((hw->media_type == e1000_media_type_fiber) && (hw->autoneg_failed)) ||
2700 ((hw->media_type == e1000_media_type_internal_serdes) &&
2701 (hw->autoneg_failed)) ||
2702 ((hw->media_type == e1000_media_type_copper) && (!hw->autoneg))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002703 ret_val = e1000_force_mac_fc(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002704 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002705 DEBUGOUT("Error forcing flow control settings\n");
2706 return ret_val;
2707 }
2708 }
2709
2710 /* Check for the case where we have copper media and auto-neg is
2711 * enabled. In this case, we need to check and see if Auto-Neg
2712 * has completed, and if so, how the PHY and link partner has
2713 * flow control configured.
2714 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002715 if ((hw->media_type == e1000_media_type_copper) && hw->autoneg) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002716 /* Read the MII Status Register and check to see if AutoNeg
2717 * has completed. We read this twice because this reg has
2718 * some "sticky" (latched) bits.
2719 */
2720 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002721 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002722 return ret_val;
2723 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002724 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002725 return ret_val;
2726
Auke Kok8fc897b2006-08-28 14:56:16 -07002727 if (mii_status_reg & MII_SR_AUTONEG_COMPLETE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002728 /* The AutoNeg process has completed, so we now need to
2729 * read both the Auto Negotiation Advertisement Register
2730 * (Address 4) and the Auto_Negotiation Base Page Ability
2731 * Register (Address 5) to determine how flow control was
2732 * negotiated.
2733 */
2734 ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV,
2735 &mii_nway_adv_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002736 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002737 return ret_val;
2738 ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY,
2739 &mii_nway_lp_ability_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07002740 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002741 return ret_val;
2742
2743 /* Two bits in the Auto Negotiation Advertisement Register
2744 * (Address 4) and two bits in the Auto Negotiation Base
2745 * Page Ability Register (Address 5) determine flow control
2746 * for both the PHY and the link partner. The following
2747 * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
2748 * 1999, describes these PAUSE resolution bits and how flow
2749 * control is determined based upon these settings.
2750 * NOTE: DC = Don't Care
2751 *
2752 * LOCAL DEVICE | LINK PARTNER
2753 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
2754 *-------|---------|-------|---------|--------------------
Jeff Kirsher11241b12006-09-27 12:53:28 -07002755 * 0 | 0 | DC | DC | E1000_FC_NONE
2756 * 0 | 1 | 0 | DC | E1000_FC_NONE
2757 * 0 | 1 | 1 | 0 | E1000_FC_NONE
2758 * 0 | 1 | 1 | 1 | E1000_FC_TX_PAUSE
2759 * 1 | 0 | 0 | DC | E1000_FC_NONE
2760 * 1 | DC | 1 | DC | E1000_FC_FULL
2761 * 1 | 1 | 0 | 0 | E1000_FC_NONE
2762 * 1 | 1 | 0 | 1 | E1000_FC_RX_PAUSE
Linus Torvalds1da177e2005-04-16 15:20:36 -07002763 *
2764 */
2765 /* Are both PAUSE bits set to 1? If so, this implies
2766 * Symmetric Flow Control is enabled at both ends. The
2767 * ASM_DIR bits are irrelevant per the spec.
2768 *
2769 * For Symmetric Flow Control:
2770 *
2771 * LOCAL DEVICE | LINK PARTNER
2772 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
2773 *-------|---------|-------|---------|--------------------
Jeff Kirsher11241b12006-09-27 12:53:28 -07002774 * 1 | DC | 1 | DC | E1000_FC_FULL
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775 *
2776 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002777 if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
2778 (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002779 /* Now we need to check if the user selected RX ONLY
2780 * of pause frames. In this case, we had to advertise
2781 * FULL flow control because we could not advertise RX
2782 * ONLY. Hence, we must now check to see if we need to
2783 * turn OFF the TRANSMISSION of PAUSE frames.
2784 */
Jeff Kirsher11241b12006-09-27 12:53:28 -07002785 if (hw->original_fc == E1000_FC_FULL) {
2786 hw->fc = E1000_FC_FULL;
Auke Koka42a5072006-05-23 13:36:01 -07002787 DEBUGOUT("Flow Control = FULL.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002788 } else {
Jeff Kirsher11241b12006-09-27 12:53:28 -07002789 hw->fc = E1000_FC_RX_PAUSE;
Auke Koka42a5072006-05-23 13:36:01 -07002790 DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002791 }
2792 }
2793 /* For receiving PAUSE frames ONLY.
2794 *
2795 * LOCAL DEVICE | LINK PARTNER
2796 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
2797 *-------|---------|-------|---------|--------------------
Jeff Kirsher11241b12006-09-27 12:53:28 -07002798 * 0 | 1 | 1 | 1 | E1000_FC_TX_PAUSE
Linus Torvalds1da177e2005-04-16 15:20:36 -07002799 *
2800 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002801 else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) &&
2802 (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
2803 (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
2804 (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
Jeff Kirsher11241b12006-09-27 12:53:28 -07002805 hw->fc = E1000_FC_TX_PAUSE;
Auke Koka42a5072006-05-23 13:36:01 -07002806 DEBUGOUT("Flow Control = TX PAUSE frames only.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002807 }
2808 /* For transmitting PAUSE frames ONLY.
2809 *
2810 * LOCAL DEVICE | LINK PARTNER
2811 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
2812 *-------|---------|-------|---------|--------------------
Jeff Kirsher11241b12006-09-27 12:53:28 -07002813 * 1 | 1 | 0 | 1 | E1000_FC_RX_PAUSE
Linus Torvalds1da177e2005-04-16 15:20:36 -07002814 *
2815 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002816 else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
2817 (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
2818 !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
2819 (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
Jeff Kirsher11241b12006-09-27 12:53:28 -07002820 hw->fc = E1000_FC_RX_PAUSE;
Auke Koka42a5072006-05-23 13:36:01 -07002821 DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822 }
2823 /* Per the IEEE spec, at this point flow control should be
2824 * disabled. However, we want to consider that we could
2825 * be connected to a legacy switch that doesn't advertise
2826 * desired flow control, but can be forced on the link
2827 * partner. So if we advertised no flow control, that is
2828 * what we will resolve to. If we advertised some kind of
2829 * receive capability (Rx Pause Only or Full Flow Control)
2830 * and the link partner advertised none, we will configure
2831 * ourselves to enable Rx Flow Control only. We can do
2832 * this safely for two reasons: If the link partner really
2833 * didn't want flow control enabled, and we enable Rx, no
2834 * harm done since we won't be receiving any PAUSE frames
2835 * anyway. If the intent on the link partner was to have
2836 * flow control enabled, then by us enabling RX only, we
2837 * can at least receive pause frames and process them.
2838 * This is a good idea because in most cases, since we are
2839 * predominantly a server NIC, more times than not we will
2840 * be asked to delay transmission of packets than asking
2841 * our link partner to pause transmission of frames.
2842 */
Jeff Kirsher11241b12006-09-27 12:53:28 -07002843 else if ((hw->original_fc == E1000_FC_NONE ||
2844 hw->original_fc == E1000_FC_TX_PAUSE) ||
Auke Kok8fc897b2006-08-28 14:56:16 -07002845 hw->fc_strict_ieee) {
Jeff Kirsher11241b12006-09-27 12:53:28 -07002846 hw->fc = E1000_FC_NONE;
Auke Koka42a5072006-05-23 13:36:01 -07002847 DEBUGOUT("Flow Control = NONE.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848 } else {
Jeff Kirsher11241b12006-09-27 12:53:28 -07002849 hw->fc = E1000_FC_RX_PAUSE;
Auke Koka42a5072006-05-23 13:36:01 -07002850 DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002851 }
2852
2853 /* Now we need to do one last check... If we auto-
2854 * negotiated to HALF DUPLEX, flow control should not be
2855 * enabled per IEEE 802.3 spec.
2856 */
2857 ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
Auke Kok8fc897b2006-08-28 14:56:16 -07002858 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859 DEBUGOUT("Error getting link speed and duplex\n");
2860 return ret_val;
2861 }
2862
Auke Kok8fc897b2006-08-28 14:56:16 -07002863 if (duplex == HALF_DUPLEX)
Jeff Kirsher11241b12006-09-27 12:53:28 -07002864 hw->fc = E1000_FC_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865
2866 /* Now we call a subroutine to actually force the MAC
2867 * controller to use the correct flow control settings.
2868 */
2869 ret_val = e1000_force_mac_fc(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002870 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871 DEBUGOUT("Error forcing flow control settings\n");
2872 return ret_val;
2873 }
2874 } else {
Auke Koka42a5072006-05-23 13:36:01 -07002875 DEBUGOUT("Copper PHY and Auto Neg has not completed.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876 }
2877 }
2878 return E1000_SUCCESS;
2879}
2880
2881/******************************************************************************
2882 * Checks to see if the link status of the hardware has changed.
2883 *
2884 * hw - Struct containing variables accessed by shared code
2885 *
2886 * Called by any function that needs to check the link status of the adapter.
2887 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07002888s32 e1000_check_for_link(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889{
Joe Perches406874a2008-04-03 10:06:32 -07002890 u32 rxcw = 0;
2891 u32 ctrl;
2892 u32 status;
2893 u32 rctl;
2894 u32 icr;
2895 u32 signal = 0;
2896 s32 ret_val;
2897 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002898
2899 DEBUGFUNC("e1000_check_for_link");
2900
Joe Perches1dc32912008-07-11 15:17:08 -07002901 ctrl = er32(CTRL);
2902 status = er32(STATUS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903
2904 /* On adapters with a MAC newer than 82544, SW Defineable pin 1 will be
2905 * set when the optics detect a signal. On older adapters, it will be
2906 * cleared when there is a signal. This applies to fiber media only.
2907 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002908 if ((hw->media_type == e1000_media_type_fiber) ||
2909 (hw->media_type == e1000_media_type_internal_serdes)) {
Joe Perches1dc32912008-07-11 15:17:08 -07002910 rxcw = er32(RXCW);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911
Auke Kok8fc897b2006-08-28 14:56:16 -07002912 if (hw->media_type == e1000_media_type_fiber) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002913 signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0;
Auke Kok8fc897b2006-08-28 14:56:16 -07002914 if (status & E1000_STATUS_LU)
Joe Perchesc3033b02008-03-21 11:06:25 -07002915 hw->get_link_status = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916 }
2917 }
2918
2919 /* If we have a copper PHY then we only want to go out to the PHY
2920 * registers to see if Auto-Neg has completed and/or if our link
2921 * status has changed. The get_link_status flag will be set if we
2922 * receive a Link Status Change interrupt or we have Rx Sequence
2923 * Errors.
2924 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002925 if ((hw->media_type == e1000_media_type_copper) && hw->get_link_status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926 /* First we want to see if the MII Status Register reports
2927 * link. If so, then we want to get the current speed/duplex
2928 * of the PHY.
2929 * Read the register twice since the link bit is sticky.
2930 */
2931 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002932 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002933 return ret_val;
2934 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07002935 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936 return ret_val;
2937
Auke Kok8fc897b2006-08-28 14:56:16 -07002938 if (phy_data & MII_SR_LINK_STATUS) {
Joe Perchesc3033b02008-03-21 11:06:25 -07002939 hw->get_link_status = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940 /* Check if there was DownShift, must be checked immediately after
2941 * link-up */
2942 e1000_check_downshift(hw);
2943
2944 /* If we are on 82544 or 82543 silicon and speed/duplex
2945 * are forced to 10H or 10F, then we will implement the polarity
2946 * reversal workaround. We disable interrupts first, and upon
2947 * returning, place the devices interrupt state to its previous
2948 * value except for the link status change interrupt which will
2949 * happen due to the execution of this workaround.
2950 */
2951
Auke Kok8fc897b2006-08-28 14:56:16 -07002952 if ((hw->mac_type == e1000_82544 || hw->mac_type == e1000_82543) &&
2953 (!hw->autoneg) &&
2954 (hw->forced_speed_duplex == e1000_10_full ||
2955 hw->forced_speed_duplex == e1000_10_half)) {
Joe Perches1dc32912008-07-11 15:17:08 -07002956 ew32(IMC, 0xffffffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957 ret_val = e1000_polarity_reversal_workaround(hw);
Joe Perches1dc32912008-07-11 15:17:08 -07002958 icr = er32(ICR);
2959 ew32(ICS, (icr & ~E1000_ICS_LSC));
2960 ew32(IMS, IMS_ENABLE_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002961 }
2962
2963 } else {
2964 /* No link detected */
Joe Perchesc3033b02008-03-21 11:06:25 -07002965 e1000_config_dsp_after_link_change(hw, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002966 return 0;
2967 }
2968
2969 /* If we are forcing speed/duplex, then we simply return since
2970 * we have already determined whether we have link or not.
2971 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002972 if (!hw->autoneg) return -E1000_ERR_CONFIG;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973
2974 /* optimize the dsp settings for the igp phy */
Joe Perchesc3033b02008-03-21 11:06:25 -07002975 e1000_config_dsp_after_link_change(hw, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976
2977 /* We have a M88E1000 PHY and Auto-Neg is enabled. If we
2978 * have Si on board that is 82544 or newer, Auto
2979 * Speed Detection takes care of MAC speed/duplex
2980 * configuration. So we only need to configure Collision
2981 * Distance in the MAC. Otherwise, we need to force
2982 * speed/duplex on the MAC to the current PHY speed/duplex
2983 * settings.
2984 */
Auke Kok8fc897b2006-08-28 14:56:16 -07002985 if (hw->mac_type >= e1000_82544)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002986 e1000_config_collision_dist(hw);
2987 else {
2988 ret_val = e1000_config_mac_to_phy(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07002989 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002990 DEBUGOUT("Error configuring MAC to PHY settings\n");
2991 return ret_val;
2992 }
2993 }
2994
2995 /* Configure Flow Control now that Auto-Neg has completed. First, we
2996 * need to restore the desired flow control settings because we may
2997 * have had to re-autoneg with a different link partner.
2998 */
2999 ret_val = e1000_config_fc_after_link_up(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07003000 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003001 DEBUGOUT("Error configuring flow control\n");
3002 return ret_val;
3003 }
3004
3005 /* At this point we know that we are on copper and we have
3006 * auto-negotiated link. These are conditions for checking the link
3007 * partner capability register. We use the link speed to determine if
3008 * TBI compatibility needs to be turned on or off. If the link is not
3009 * at gigabit speed, then TBI compatibility is not needed. If we are
3010 * at gigabit speed, we turn on TBI compatibility.
3011 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003012 if (hw->tbi_compatibility_en) {
Joe Perches406874a2008-04-03 10:06:32 -07003013 u16 speed, duplex;
Auke Kok592600a2006-06-27 09:08:09 -07003014 ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
3015 if (ret_val) {
3016 DEBUGOUT("Error getting link speed and duplex\n");
3017 return ret_val;
3018 }
3019 if (speed != SPEED_1000) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003020 /* If link speed is not set to gigabit speed, we do not need
3021 * to enable TBI compatibility.
3022 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003023 if (hw->tbi_compatibility_on) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003024 /* If we previously were in the mode, turn it off. */
Joe Perches1dc32912008-07-11 15:17:08 -07003025 rctl = er32(RCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003026 rctl &= ~E1000_RCTL_SBP;
Joe Perches1dc32912008-07-11 15:17:08 -07003027 ew32(RCTL, rctl);
Joe Perchesc3033b02008-03-21 11:06:25 -07003028 hw->tbi_compatibility_on = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003029 }
3030 } else {
3031 /* If TBI compatibility is was previously off, turn it on. For
3032 * compatibility with a TBI link partner, we will store bad
3033 * packets. Some frames have an additional byte on the end and
3034 * will look like CRC errors to to the hardware.
3035 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003036 if (!hw->tbi_compatibility_on) {
Joe Perchesc3033b02008-03-21 11:06:25 -07003037 hw->tbi_compatibility_on = true;
Joe Perches1dc32912008-07-11 15:17:08 -07003038 rctl = er32(RCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003039 rctl |= E1000_RCTL_SBP;
Joe Perches1dc32912008-07-11 15:17:08 -07003040 ew32(RCTL, rctl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003041 }
3042 }
3043 }
3044 }
3045 /* If we don't have link (auto-negotiation failed or link partner cannot
3046 * auto-negotiate), the cable is plugged in (we have signal), and our
3047 * link partner is not trying to auto-negotiate with us (we are receiving
3048 * idles or data), we need to force link up. We also need to give
3049 * auto-negotiation time to complete, in case the cable was just plugged
3050 * in. The autoneg_failed flag does this.
3051 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003052 else if ((((hw->media_type == e1000_media_type_fiber) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07003053 ((ctrl & E1000_CTRL_SWDPIN1) == signal)) ||
Auke Kok8fc897b2006-08-28 14:56:16 -07003054 (hw->media_type == e1000_media_type_internal_serdes)) &&
3055 (!(status & E1000_STATUS_LU)) &&
3056 (!(rxcw & E1000_RXCW_C))) {
3057 if (hw->autoneg_failed == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003058 hw->autoneg_failed = 1;
3059 return 0;
3060 }
Auke Koka42a5072006-05-23 13:36:01 -07003061 DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003062
3063 /* Disable auto-negotiation in the TXCW register */
Joe Perches1dc32912008-07-11 15:17:08 -07003064 ew32(TXCW, (hw->txcw & ~E1000_TXCW_ANE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003065
3066 /* Force link-up and also force full-duplex. */
Joe Perches1dc32912008-07-11 15:17:08 -07003067 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003068 ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
Joe Perches1dc32912008-07-11 15:17:08 -07003069 ew32(CTRL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003070
3071 /* Configure Flow Control after forcing link up. */
3072 ret_val = e1000_config_fc_after_link_up(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07003073 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003074 DEBUGOUT("Error configuring flow control\n");
3075 return ret_val;
3076 }
3077 }
3078 /* If we are forcing link and we are receiving /C/ ordered sets, re-enable
3079 * auto-negotiation in the TXCW register and disable forced link in the
3080 * Device Control register in an attempt to auto-negotiate with our link
3081 * partner.
3082 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003083 else if (((hw->media_type == e1000_media_type_fiber) ||
3084 (hw->media_type == e1000_media_type_internal_serdes)) &&
3085 (ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
Auke Koka42a5072006-05-23 13:36:01 -07003086 DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n");
Joe Perches1dc32912008-07-11 15:17:08 -07003087 ew32(TXCW, hw->txcw);
3088 ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089
Joe Perchesc3033b02008-03-21 11:06:25 -07003090 hw->serdes_link_down = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003091 }
3092 /* If we force link for non-auto-negotiation switch, check link status
3093 * based on MAC synchronization for internal serdes media type.
3094 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003095 else if ((hw->media_type == e1000_media_type_internal_serdes) &&
Joe Perches1dc32912008-07-11 15:17:08 -07003096 !(E1000_TXCW_ANE & er32(TXCW))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003097 /* SYNCH bit and IV bit are sticky. */
3098 udelay(10);
Joe Perches1dc32912008-07-11 15:17:08 -07003099 if (E1000_RXCW_SYNCH & er32(RXCW)) {
Auke Kok8fc897b2006-08-28 14:56:16 -07003100 if (!(rxcw & E1000_RXCW_IV)) {
Joe Perchesc3033b02008-03-21 11:06:25 -07003101 hw->serdes_link_down = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003102 DEBUGOUT("SERDES: Link is up.\n");
3103 }
3104 } else {
Joe Perchesc3033b02008-03-21 11:06:25 -07003105 hw->serdes_link_down = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003106 DEBUGOUT("SERDES: Link is down.\n");
3107 }
3108 }
Auke Kok8fc897b2006-08-28 14:56:16 -07003109 if ((hw->media_type == e1000_media_type_internal_serdes) &&
Joe Perches1dc32912008-07-11 15:17:08 -07003110 (E1000_TXCW_ANE & er32(TXCW))) {
3111 hw->serdes_link_down = !(E1000_STATUS_LU & er32(STATUS));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003112 }
3113 return E1000_SUCCESS;
3114}
3115
3116/******************************************************************************
3117 * Detects the current speed and duplex settings of the hardware.
3118 *
3119 * hw - Struct containing variables accessed by shared code
3120 * speed - Speed of the connection
3121 * duplex - Duplex setting of the connection
3122 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003123s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003124{
Joe Perches406874a2008-04-03 10:06:32 -07003125 u32 status;
3126 s32 ret_val;
3127 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003128
3129 DEBUGFUNC("e1000_get_speed_and_duplex");
3130
Auke Kok8fc897b2006-08-28 14:56:16 -07003131 if (hw->mac_type >= e1000_82543) {
Joe Perches1dc32912008-07-11 15:17:08 -07003132 status = er32(STATUS);
Auke Kok8fc897b2006-08-28 14:56:16 -07003133 if (status & E1000_STATUS_SPEED_1000) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003134 *speed = SPEED_1000;
3135 DEBUGOUT("1000 Mbs, ");
Auke Kok8fc897b2006-08-28 14:56:16 -07003136 } else if (status & E1000_STATUS_SPEED_100) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003137 *speed = SPEED_100;
3138 DEBUGOUT("100 Mbs, ");
3139 } else {
3140 *speed = SPEED_10;
3141 DEBUGOUT("10 Mbs, ");
3142 }
3143
Auke Kok8fc897b2006-08-28 14:56:16 -07003144 if (status & E1000_STATUS_FD) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145 *duplex = FULL_DUPLEX;
Auke Koka42a5072006-05-23 13:36:01 -07003146 DEBUGOUT("Full Duplex\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003147 } else {
3148 *duplex = HALF_DUPLEX;
Auke Koka42a5072006-05-23 13:36:01 -07003149 DEBUGOUT(" Half Duplex\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003150 }
3151 } else {
Auke Koka42a5072006-05-23 13:36:01 -07003152 DEBUGOUT("1000 Mbs, Full Duplex\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153 *speed = SPEED_1000;
3154 *duplex = FULL_DUPLEX;
3155 }
3156
3157 /* IGP01 PHY may advertise full duplex operation after speed downgrade even
3158 * if it is operating at half duplex. Here we set the duplex settings to
3159 * match the duplex in the link partner's capabilities.
3160 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003161 if (hw->phy_type == e1000_phy_igp && hw->speed_downgraded) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003162 ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07003163 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003164 return ret_val;
3165
Auke Kok8fc897b2006-08-28 14:56:16 -07003166 if (!(phy_data & NWAY_ER_LP_NWAY_CAPS))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003167 *duplex = HALF_DUPLEX;
3168 else {
3169 ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07003170 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003171 return ret_val;
Auke Kok8fc897b2006-08-28 14:56:16 -07003172 if ((*speed == SPEED_100 && !(phy_data & NWAY_LPAR_100TX_FD_CAPS)) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07003173 (*speed == SPEED_10 && !(phy_data & NWAY_LPAR_10T_FD_CAPS)))
3174 *duplex = HALF_DUPLEX;
3175 }
3176 }
3177
Auke Kok76c224b2006-05-23 13:36:06 -07003178 if ((hw->mac_type == e1000_80003es2lan) &&
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003179 (hw->media_type == e1000_media_type_copper)) {
3180 if (*speed == SPEED_1000)
3181 ret_val = e1000_configure_kmrn_for_1000(hw);
3182 else
Auke Kokcd94dd02006-06-27 09:08:22 -07003183 ret_val = e1000_configure_kmrn_for_10_100(hw, *duplex);
3184 if (ret_val)
3185 return ret_val;
3186 }
3187
3188 if ((hw->phy_type == e1000_phy_igp_3) && (*speed == SPEED_1000)) {
3189 ret_val = e1000_kumeran_lock_loss_workaround(hw);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003190 if (ret_val)
3191 return ret_val;
3192 }
3193
Linus Torvalds1da177e2005-04-16 15:20:36 -07003194 return E1000_SUCCESS;
3195}
3196
3197/******************************************************************************
3198* Blocks until autoneg completes or times out (~4.5 seconds)
3199*
3200* hw - Struct containing variables accessed by shared code
3201******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003202static s32 e1000_wait_autoneg(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003203{
Joe Perches406874a2008-04-03 10:06:32 -07003204 s32 ret_val;
3205 u16 i;
3206 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207
3208 DEBUGFUNC("e1000_wait_autoneg");
3209 DEBUGOUT("Waiting for Auto-Neg to complete.\n");
3210
3211 /* We will wait for autoneg to complete or 4.5 seconds to expire. */
Auke Kok8fc897b2006-08-28 14:56:16 -07003212 for (i = PHY_AUTO_NEG_TIME; i > 0; i--) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003213 /* Read the MII Status Register and wait for Auto-Neg
3214 * Complete bit to be set.
3215 */
3216 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07003217 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003218 return ret_val;
3219 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07003220 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003221 return ret_val;
Auke Kok8fc897b2006-08-28 14:56:16 -07003222 if (phy_data & MII_SR_AUTONEG_COMPLETE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003223 return E1000_SUCCESS;
3224 }
Jeff Garzikf8ec4732006-09-19 15:27:07 -04003225 msleep(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003226 }
3227 return E1000_SUCCESS;
3228}
3229
3230/******************************************************************************
3231* Raises the Management Data Clock
3232*
3233* hw - Struct containing variables accessed by shared code
3234* ctrl - Device control register's current value
3235******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003236static void e1000_raise_mdi_clk(struct e1000_hw *hw, u32 *ctrl)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003237{
3238 /* Raise the clock input to the Management Data Clock (by setting the MDC
3239 * bit), and then delay 10 microseconds.
3240 */
Joe Perches1dc32912008-07-11 15:17:08 -07003241 ew32(CTRL, (*ctrl | E1000_CTRL_MDC));
3242 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07003243 udelay(10);
3244}
3245
3246/******************************************************************************
3247* Lowers the Management Data Clock
3248*
3249* hw - Struct containing variables accessed by shared code
3250* ctrl - Device control register's current value
3251******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003252static void e1000_lower_mdi_clk(struct e1000_hw *hw, u32 *ctrl)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003253{
3254 /* Lower the clock input to the Management Data Clock (by clearing the MDC
3255 * bit), and then delay 10 microseconds.
3256 */
Joe Perches1dc32912008-07-11 15:17:08 -07003257 ew32(CTRL, (*ctrl & ~E1000_CTRL_MDC));
3258 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259 udelay(10);
3260}
3261
3262/******************************************************************************
3263* Shifts data bits out to the PHY
3264*
3265* hw - Struct containing variables accessed by shared code
3266* data - Data to send out to the PHY
3267* count - Number of bits to shift out
3268*
3269* Bits are shifted out in MSB to LSB order.
3270******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003271static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, u32 data, u16 count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003272{
Joe Perches406874a2008-04-03 10:06:32 -07003273 u32 ctrl;
3274 u32 mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003275
3276 /* We need to shift "count" number of bits out to the PHY. So, the value
3277 * in the "data" parameter will be shifted out to the PHY one bit at a
3278 * time. In order to do this, "data" must be broken down into bits.
3279 */
3280 mask = 0x01;
3281 mask <<= (count - 1);
3282
Joe Perches1dc32912008-07-11 15:17:08 -07003283 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003284
3285 /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */
3286 ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR);
3287
Auke Kok8fc897b2006-08-28 14:56:16 -07003288 while (mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003289 /* A "1" is shifted out to the PHY by setting the MDIO bit to "1" and
3290 * then raising and lowering the Management Data Clock. A "0" is
3291 * shifted out to the PHY by setting the MDIO bit to "0" and then
3292 * raising and lowering the clock.
3293 */
Auke Kok8fc897b2006-08-28 14:56:16 -07003294 if (data & mask)
3295 ctrl |= E1000_CTRL_MDIO;
3296 else
3297 ctrl &= ~E1000_CTRL_MDIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003298
Joe Perches1dc32912008-07-11 15:17:08 -07003299 ew32(CTRL, ctrl);
3300 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07003301
3302 udelay(10);
3303
3304 e1000_raise_mdi_clk(hw, &ctrl);
3305 e1000_lower_mdi_clk(hw, &ctrl);
3306
3307 mask = mask >> 1;
3308 }
3309}
3310
3311/******************************************************************************
3312* Shifts data bits in from the PHY
3313*
3314* hw - Struct containing variables accessed by shared code
3315*
3316* Bits are shifted in in MSB to LSB order.
3317******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003318static u16 e1000_shift_in_mdi_bits(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003319{
Joe Perches406874a2008-04-03 10:06:32 -07003320 u32 ctrl;
3321 u16 data = 0;
3322 u8 i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003323
3324 /* In order to read a register from the PHY, we need to shift in a total
3325 * of 18 bits from the PHY. The first two bit (turnaround) times are used
3326 * to avoid contention on the MDIO pin when a read operation is performed.
3327 * These two bits are ignored by us and thrown away. Bits are "shifted in"
3328 * by raising the input to the Management Data Clock (setting the MDC bit),
3329 * and then reading the value of the MDIO bit.
3330 */
Joe Perches1dc32912008-07-11 15:17:08 -07003331 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003332
3333 /* Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as input. */
3334 ctrl &= ~E1000_CTRL_MDIO_DIR;
3335 ctrl &= ~E1000_CTRL_MDIO;
3336
Joe Perches1dc32912008-07-11 15:17:08 -07003337 ew32(CTRL, ctrl);
3338 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07003339
3340 /* Raise and Lower the clock before reading in the data. This accounts for
3341 * the turnaround bits. The first clock occurred when we clocked out the
3342 * last bit of the Register Address.
3343 */
3344 e1000_raise_mdi_clk(hw, &ctrl);
3345 e1000_lower_mdi_clk(hw, &ctrl);
3346
Auke Kok8fc897b2006-08-28 14:56:16 -07003347 for (data = 0, i = 0; i < 16; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003348 data = data << 1;
3349 e1000_raise_mdi_clk(hw, &ctrl);
Joe Perches1dc32912008-07-11 15:17:08 -07003350 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003351 /* Check to see if we shifted in a "1". */
Auke Kok8fc897b2006-08-28 14:56:16 -07003352 if (ctrl & E1000_CTRL_MDIO)
3353 data |= 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003354 e1000_lower_mdi_clk(hw, &ctrl);
3355 }
3356
3357 e1000_raise_mdi_clk(hw, &ctrl);
3358 e1000_lower_mdi_clk(hw, &ctrl);
3359
3360 return data;
3361}
3362
Joe Perches64798842008-07-11 15:17:02 -07003363static s32 e1000_swfw_sync_acquire(struct e1000_hw *hw, u16 mask)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003364{
Joe Perches406874a2008-04-03 10:06:32 -07003365 u32 swfw_sync = 0;
3366 u32 swmask = mask;
3367 u32 fwmask = mask << 16;
3368 s32 timeout = 200;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003369
3370 DEBUGFUNC("e1000_swfw_sync_acquire");
3371
Auke Kokcd94dd02006-06-27 09:08:22 -07003372 if (hw->swfwhw_semaphore_present)
3373 return e1000_get_software_flag(hw);
3374
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003375 if (!hw->swfw_sync_present)
3376 return e1000_get_hw_eeprom_semaphore(hw);
3377
Auke Kok8fc897b2006-08-28 14:56:16 -07003378 while (timeout) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003379 if (e1000_get_hw_eeprom_semaphore(hw))
3380 return -E1000_ERR_SWFW_SYNC;
3381
Joe Perches1dc32912008-07-11 15:17:08 -07003382 swfw_sync = er32(SW_FW_SYNC);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003383 if (!(swfw_sync & (fwmask | swmask))) {
3384 break;
3385 }
3386
3387 /* firmware currently using resource (fwmask) */
3388 /* or other software thread currently using resource (swmask) */
3389 e1000_put_hw_eeprom_semaphore(hw);
Jeff Garzikf8ec4732006-09-19 15:27:07 -04003390 mdelay(5);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003391 timeout--;
3392 }
3393
3394 if (!timeout) {
3395 DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n");
3396 return -E1000_ERR_SWFW_SYNC;
3397 }
3398
3399 swfw_sync |= swmask;
Joe Perches1dc32912008-07-11 15:17:08 -07003400 ew32(SW_FW_SYNC, swfw_sync);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003401
3402 e1000_put_hw_eeprom_semaphore(hw);
3403 return E1000_SUCCESS;
3404}
3405
Joe Perches64798842008-07-11 15:17:02 -07003406static void e1000_swfw_sync_release(struct e1000_hw *hw, u16 mask)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003407{
Joe Perches406874a2008-04-03 10:06:32 -07003408 u32 swfw_sync;
3409 u32 swmask = mask;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003410
3411 DEBUGFUNC("e1000_swfw_sync_release");
3412
Auke Kokcd94dd02006-06-27 09:08:22 -07003413 if (hw->swfwhw_semaphore_present) {
3414 e1000_release_software_flag(hw);
3415 return;
3416 }
3417
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003418 if (!hw->swfw_sync_present) {
3419 e1000_put_hw_eeprom_semaphore(hw);
3420 return;
3421 }
3422
3423 /* if (e1000_get_hw_eeprom_semaphore(hw))
3424 * return -E1000_ERR_SWFW_SYNC; */
3425 while (e1000_get_hw_eeprom_semaphore(hw) != E1000_SUCCESS);
3426 /* empty */
3427
Joe Perches1dc32912008-07-11 15:17:08 -07003428 swfw_sync = er32(SW_FW_SYNC);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003429 swfw_sync &= ~swmask;
Joe Perches1dc32912008-07-11 15:17:08 -07003430 ew32(SW_FW_SYNC, swfw_sync);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003431
3432 e1000_put_hw_eeprom_semaphore(hw);
3433}
3434
Linus Torvalds1da177e2005-04-16 15:20:36 -07003435/*****************************************************************************
3436* Reads the value from a PHY register, if the value is on a specific non zero
3437* page, sets the page first.
3438* hw - Struct containing variables accessed by shared code
3439* reg_addr - address of the PHY register to read
3440******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003441s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 reg_addr, u16 *phy_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003442{
Joe Perches406874a2008-04-03 10:06:32 -07003443 u32 ret_val;
3444 u16 swfw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003445
3446 DEBUGFUNC("e1000_read_phy_reg");
3447
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003448 if ((hw->mac_type == e1000_80003es2lan) &&
Joe Perches1dc32912008-07-11 15:17:08 -07003449 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003450 swfw = E1000_SWFW_PHY1_SM;
3451 } else {
3452 swfw = E1000_SWFW_PHY0_SM;
3453 }
3454 if (e1000_swfw_sync_acquire(hw, swfw))
3455 return -E1000_ERR_SWFW_SYNC;
3456
Auke Kokcd94dd02006-06-27 09:08:22 -07003457 if ((hw->phy_type == e1000_phy_igp ||
3458 hw->phy_type == e1000_phy_igp_3 ||
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003459 hw->phy_type == e1000_phy_igp_2) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07003460 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
3461 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
Joe Perches406874a2008-04-03 10:06:32 -07003462 (u16)reg_addr);
Auke Kok8fc897b2006-08-28 14:56:16 -07003463 if (ret_val) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003464 e1000_swfw_sync_release(hw, swfw);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003465 return ret_val;
3466 }
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003467 } else if (hw->phy_type == e1000_phy_gg82563) {
3468 if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) ||
3469 (hw->mac_type == e1000_80003es2lan)) {
3470 /* Select Configuration Page */
3471 if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
3472 ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT,
Joe Perches406874a2008-04-03 10:06:32 -07003473 (u16)((u16)reg_addr >> GG82563_PAGE_SHIFT));
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003474 } else {
3475 /* Use Alternative Page Select register to access
3476 * registers 30 and 31
3477 */
3478 ret_val = e1000_write_phy_reg_ex(hw,
3479 GG82563_PHY_PAGE_SELECT_ALT,
Joe Perches406874a2008-04-03 10:06:32 -07003480 (u16)((u16)reg_addr >> GG82563_PAGE_SHIFT));
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003481 }
3482
3483 if (ret_val) {
3484 e1000_swfw_sync_release(hw, swfw);
3485 return ret_val;
3486 }
3487 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003488 }
3489
3490 ret_val = e1000_read_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
3491 phy_data);
3492
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003493 e1000_swfw_sync_release(hw, swfw);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003494 return ret_val;
3495}
3496
Joe Perches64798842008-07-11 15:17:02 -07003497static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3498 u16 *phy_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003499{
Joe Perches406874a2008-04-03 10:06:32 -07003500 u32 i;
3501 u32 mdic = 0;
3502 const u32 phy_addr = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003503
3504 DEBUGFUNC("e1000_read_phy_reg_ex");
3505
Auke Kok8fc897b2006-08-28 14:56:16 -07003506 if (reg_addr > MAX_PHY_REG_ADDRESS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003507 DEBUGOUT1("PHY Address %d is out of range\n", reg_addr);
3508 return -E1000_ERR_PARAM;
3509 }
3510
Auke Kok8fc897b2006-08-28 14:56:16 -07003511 if (hw->mac_type > e1000_82543) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003512 /* Set up Op-code, Phy Address, and register address in the MDI
3513 * Control register. The MAC will take care of interfacing with the
3514 * PHY to retrieve the desired data.
3515 */
3516 mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) |
3517 (phy_addr << E1000_MDIC_PHY_SHIFT) |
3518 (E1000_MDIC_OP_READ));
3519
Joe Perches1dc32912008-07-11 15:17:08 -07003520 ew32(MDIC, mdic);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003521
3522 /* Poll the ready bit to see if the MDI read completed */
Auke Kok8fc897b2006-08-28 14:56:16 -07003523 for (i = 0; i < 64; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003524 udelay(50);
Joe Perches1dc32912008-07-11 15:17:08 -07003525 mdic = er32(MDIC);
Auke Kok8fc897b2006-08-28 14:56:16 -07003526 if (mdic & E1000_MDIC_READY) break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003527 }
Auke Kok8fc897b2006-08-28 14:56:16 -07003528 if (!(mdic & E1000_MDIC_READY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003529 DEBUGOUT("MDI Read did not complete\n");
3530 return -E1000_ERR_PHY;
3531 }
Auke Kok8fc897b2006-08-28 14:56:16 -07003532 if (mdic & E1000_MDIC_ERROR) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003533 DEBUGOUT("MDI Error\n");
3534 return -E1000_ERR_PHY;
3535 }
Joe Perchese982f172008-07-11 15:17:18 -07003536 *phy_data = (u16)mdic;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003537 } else {
3538 /* We must first send a preamble through the MDIO pin to signal the
3539 * beginning of an MII instruction. This is done by sending 32
3540 * consecutive "1" bits.
3541 */
3542 e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
3543
3544 /* Now combine the next few fields that are required for a read
3545 * operation. We use this method instead of calling the
3546 * e1000_shift_out_mdi_bits routine five different times. The format of
3547 * a MII read instruction consists of a shift out of 14 bits and is
3548 * defined as follows:
3549 * <Preamble><SOF><Op Code><Phy Addr><Reg Addr>
3550 * followed by a shift in of 18 bits. This first two bits shifted in
3551 * are TurnAround bits used to avoid contention on the MDIO pin when a
3552 * READ operation is performed. These two bits are thrown away
3553 * followed by a shift in of 16 bits which contains the desired data.
3554 */
3555 mdic = ((reg_addr) | (phy_addr << 5) |
3556 (PHY_OP_READ << 10) | (PHY_SOF << 12));
3557
3558 e1000_shift_out_mdi_bits(hw, mdic, 14);
3559
3560 /* Now that we've shifted out the read command to the MII, we need to
3561 * "shift in" the 16-bit value (18 total bits) of the requested PHY
3562 * register address.
3563 */
3564 *phy_data = e1000_shift_in_mdi_bits(hw);
3565 }
3566 return E1000_SUCCESS;
3567}
3568
3569/******************************************************************************
3570* Writes a value to a PHY register
3571*
3572* hw - Struct containing variables accessed by shared code
3573* reg_addr - address of the PHY register to write
3574* data - data to write to the PHY
3575******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003576s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 reg_addr, u16 phy_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003577{
Joe Perches406874a2008-04-03 10:06:32 -07003578 u32 ret_val;
3579 u16 swfw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003580
3581 DEBUGFUNC("e1000_write_phy_reg");
3582
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003583 if ((hw->mac_type == e1000_80003es2lan) &&
Joe Perches1dc32912008-07-11 15:17:08 -07003584 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003585 swfw = E1000_SWFW_PHY1_SM;
3586 } else {
3587 swfw = E1000_SWFW_PHY0_SM;
3588 }
3589 if (e1000_swfw_sync_acquire(hw, swfw))
3590 return -E1000_ERR_SWFW_SYNC;
3591
Auke Kokcd94dd02006-06-27 09:08:22 -07003592 if ((hw->phy_type == e1000_phy_igp ||
3593 hw->phy_type == e1000_phy_igp_3 ||
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003594 hw->phy_type == e1000_phy_igp_2) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07003595 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
3596 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
Joe Perches406874a2008-04-03 10:06:32 -07003597 (u16)reg_addr);
Auke Kok8fc897b2006-08-28 14:56:16 -07003598 if (ret_val) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003599 e1000_swfw_sync_release(hw, swfw);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003600 return ret_val;
3601 }
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003602 } else if (hw->phy_type == e1000_phy_gg82563) {
3603 if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) ||
3604 (hw->mac_type == e1000_80003es2lan)) {
3605 /* Select Configuration Page */
3606 if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
3607 ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT,
Joe Perches406874a2008-04-03 10:06:32 -07003608 (u16)((u16)reg_addr >> GG82563_PAGE_SHIFT));
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003609 } else {
3610 /* Use Alternative Page Select register to access
3611 * registers 30 and 31
3612 */
3613 ret_val = e1000_write_phy_reg_ex(hw,
3614 GG82563_PHY_PAGE_SELECT_ALT,
Joe Perches406874a2008-04-03 10:06:32 -07003615 (u16)((u16)reg_addr >> GG82563_PAGE_SHIFT));
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003616 }
3617
3618 if (ret_val) {
3619 e1000_swfw_sync_release(hw, swfw);
3620 return ret_val;
3621 }
3622 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003623 }
3624
3625 ret_val = e1000_write_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
3626 phy_data);
3627
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003628 e1000_swfw_sync_release(hw, swfw);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003629 return ret_val;
3630}
3631
Joe Perches64798842008-07-11 15:17:02 -07003632static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
3633 u16 phy_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003634{
Joe Perches406874a2008-04-03 10:06:32 -07003635 u32 i;
3636 u32 mdic = 0;
3637 const u32 phy_addr = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003638
3639 DEBUGFUNC("e1000_write_phy_reg_ex");
3640
Auke Kok8fc897b2006-08-28 14:56:16 -07003641 if (reg_addr > MAX_PHY_REG_ADDRESS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003642 DEBUGOUT1("PHY Address %d is out of range\n", reg_addr);
3643 return -E1000_ERR_PARAM;
3644 }
3645
Auke Kok8fc897b2006-08-28 14:56:16 -07003646 if (hw->mac_type > e1000_82543) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003647 /* Set up Op-code, Phy Address, register address, and data intended
3648 * for the PHY register in the MDI Control register. The MAC will take
3649 * care of interfacing with the PHY to send the desired data.
3650 */
Joe Perchese982f172008-07-11 15:17:18 -07003651 mdic = (((u32)phy_data) |
Linus Torvalds1da177e2005-04-16 15:20:36 -07003652 (reg_addr << E1000_MDIC_REG_SHIFT) |
3653 (phy_addr << E1000_MDIC_PHY_SHIFT) |
3654 (E1000_MDIC_OP_WRITE));
3655
Joe Perches1dc32912008-07-11 15:17:08 -07003656 ew32(MDIC, mdic);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003657
3658 /* Poll the ready bit to see if the MDI read completed */
Auke Kok8fc897b2006-08-28 14:56:16 -07003659 for (i = 0; i < 641; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003660 udelay(5);
Joe Perches1dc32912008-07-11 15:17:08 -07003661 mdic = er32(MDIC);
Auke Kok8fc897b2006-08-28 14:56:16 -07003662 if (mdic & E1000_MDIC_READY) break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003663 }
Auke Kok8fc897b2006-08-28 14:56:16 -07003664 if (!(mdic & E1000_MDIC_READY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003665 DEBUGOUT("MDI Write did not complete\n");
3666 return -E1000_ERR_PHY;
3667 }
3668 } else {
3669 /* We'll need to use the SW defined pins to shift the write command
3670 * out to the PHY. We first send a preamble to the PHY to signal the
3671 * beginning of the MII instruction. This is done by sending 32
3672 * consecutive "1" bits.
3673 */
3674 e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
3675
3676 /* Now combine the remaining required fields that will indicate a
3677 * write operation. We use this method instead of calling the
3678 * e1000_shift_out_mdi_bits routine for each field in the command. The
3679 * format of a MII write instruction is as follows:
3680 * <Preamble><SOF><Op Code><Phy Addr><Reg Addr><Turnaround><Data>.
3681 */
3682 mdic = ((PHY_TURNAROUND) | (reg_addr << 2) | (phy_addr << 7) |
3683 (PHY_OP_WRITE << 12) | (PHY_SOF << 14));
3684 mdic <<= 16;
Joe Perchese982f172008-07-11 15:17:18 -07003685 mdic |= (u32)phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003686
3687 e1000_shift_out_mdi_bits(hw, mdic, 32);
3688 }
3689
3690 return E1000_SUCCESS;
3691}
3692
Joe Perches64798842008-07-11 15:17:02 -07003693static s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 reg_addr, u16 *data)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003694{
Joe Perches406874a2008-04-03 10:06:32 -07003695 u32 reg_val;
3696 u16 swfw;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003697 DEBUGFUNC("e1000_read_kmrn_reg");
3698
3699 if ((hw->mac_type == e1000_80003es2lan) &&
Joe Perches1dc32912008-07-11 15:17:08 -07003700 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003701 swfw = E1000_SWFW_PHY1_SM;
3702 } else {
3703 swfw = E1000_SWFW_PHY0_SM;
3704 }
3705 if (e1000_swfw_sync_acquire(hw, swfw))
3706 return -E1000_ERR_SWFW_SYNC;
3707
3708 /* Write register address */
3709 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
3710 E1000_KUMCTRLSTA_OFFSET) |
3711 E1000_KUMCTRLSTA_REN;
Joe Perches1dc32912008-07-11 15:17:08 -07003712 ew32(KUMCTRLSTA, reg_val);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003713 udelay(2);
3714
3715 /* Read the data returned */
Joe Perches1dc32912008-07-11 15:17:08 -07003716 reg_val = er32(KUMCTRLSTA);
Joe Perches406874a2008-04-03 10:06:32 -07003717 *data = (u16)reg_val;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003718
3719 e1000_swfw_sync_release(hw, swfw);
3720 return E1000_SUCCESS;
3721}
3722
Joe Perches64798842008-07-11 15:17:02 -07003723static s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 reg_addr, u16 data)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003724{
Joe Perches406874a2008-04-03 10:06:32 -07003725 u32 reg_val;
3726 u16 swfw;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003727 DEBUGFUNC("e1000_write_kmrn_reg");
3728
3729 if ((hw->mac_type == e1000_80003es2lan) &&
Joe Perches1dc32912008-07-11 15:17:08 -07003730 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003731 swfw = E1000_SWFW_PHY1_SM;
3732 } else {
3733 swfw = E1000_SWFW_PHY0_SM;
3734 }
3735 if (e1000_swfw_sync_acquire(hw, swfw))
3736 return -E1000_ERR_SWFW_SYNC;
3737
3738 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
3739 E1000_KUMCTRLSTA_OFFSET) | data;
Joe Perches1dc32912008-07-11 15:17:08 -07003740 ew32(KUMCTRLSTA, reg_val);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003741 udelay(2);
3742
3743 e1000_swfw_sync_release(hw, swfw);
3744 return E1000_SUCCESS;
3745}
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003746
Linus Torvalds1da177e2005-04-16 15:20:36 -07003747/******************************************************************************
3748* Returns the PHY to the power-on reset state
3749*
3750* hw - Struct containing variables accessed by shared code
3751******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003752s32 e1000_phy_hw_reset(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003753{
Joe Perches406874a2008-04-03 10:06:32 -07003754 u32 ctrl, ctrl_ext;
3755 u32 led_ctrl;
3756 s32 ret_val;
3757 u16 swfw;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003758
3759 DEBUGFUNC("e1000_phy_hw_reset");
3760
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003761 /* In the case of the phy reset being blocked, it's not an error, we
3762 * simply return success without performing the reset. */
3763 ret_val = e1000_check_phy_reset_block(hw);
3764 if (ret_val)
3765 return E1000_SUCCESS;
3766
Linus Torvalds1da177e2005-04-16 15:20:36 -07003767 DEBUGOUT("Resetting Phy...\n");
3768
Auke Kok8fc897b2006-08-28 14:56:16 -07003769 if (hw->mac_type > e1000_82543) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003770 if ((hw->mac_type == e1000_80003es2lan) &&
Joe Perches1dc32912008-07-11 15:17:08 -07003771 (er32(STATUS) & E1000_STATUS_FUNC_1)) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003772 swfw = E1000_SWFW_PHY1_SM;
3773 } else {
3774 swfw = E1000_SWFW_PHY0_SM;
3775 }
3776 if (e1000_swfw_sync_acquire(hw, swfw)) {
Jeff Kirsher2a88c172006-09-27 12:54:05 -07003777 DEBUGOUT("Unable to acquire swfw sync\n");
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003778 return -E1000_ERR_SWFW_SYNC;
3779 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003780 /* Read the device control register and assert the E1000_CTRL_PHY_RST
3781 * bit. Then, take it out of reset.
Auke Kok76c224b2006-05-23 13:36:06 -07003782 * For pre-e1000_82571 hardware, we delay for 10ms between the assert
Jeff Kirsherfd803242005-12-13 00:06:22 -05003783 * and deassert. For e1000_82571 hardware and later, we instead delay
Jeff Kirsher0f15a8f2006-03-02 18:46:29 -08003784 * for 50us between and 10ms after the deassertion.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003785 */
Joe Perches1dc32912008-07-11 15:17:08 -07003786 ctrl = er32(CTRL);
3787 ew32(CTRL, ctrl | E1000_CTRL_PHY_RST);
3788 E1000_WRITE_FLUSH();
Auke Kok76c224b2006-05-23 13:36:06 -07003789
3790 if (hw->mac_type < e1000_82571)
Jeff Garzikf8ec4732006-09-19 15:27:07 -04003791 msleep(10);
Jeff Kirsherb55ccb32006-01-12 16:50:30 -08003792 else
3793 udelay(100);
Auke Kok76c224b2006-05-23 13:36:06 -07003794
Joe Perches1dc32912008-07-11 15:17:08 -07003795 ew32(CTRL, ctrl);
3796 E1000_WRITE_FLUSH();
Auke Kok76c224b2006-05-23 13:36:06 -07003797
Jeff Kirsherfd803242005-12-13 00:06:22 -05003798 if (hw->mac_type >= e1000_82571)
Jeff Garzikf8ec4732006-09-19 15:27:07 -04003799 mdelay(10);
Nicholas Nunley35574762006-09-27 12:53:34 -07003800
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003801 e1000_swfw_sync_release(hw, swfw);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003802 } else {
3803 /* Read the Extended Device Control Register, assert the PHY_RESET_DIR
3804 * bit to put the PHY into reset. Then, take it out of reset.
3805 */
Joe Perches1dc32912008-07-11 15:17:08 -07003806 ctrl_ext = er32(CTRL_EXT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003807 ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR;
3808 ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA;
Joe Perches1dc32912008-07-11 15:17:08 -07003809 ew32(CTRL_EXT, ctrl_ext);
3810 E1000_WRITE_FLUSH();
Jeff Garzikf8ec4732006-09-19 15:27:07 -04003811 msleep(10);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003812 ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA;
Joe Perches1dc32912008-07-11 15:17:08 -07003813 ew32(CTRL_EXT, ctrl_ext);
3814 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07003815 }
3816 udelay(150);
3817
Auke Kok8fc897b2006-08-28 14:56:16 -07003818 if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003819 /* Configure activity LED after PHY reset */
Joe Perches1dc32912008-07-11 15:17:08 -07003820 led_ctrl = er32(LEDCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003821 led_ctrl &= IGP_ACTIVITY_LED_MASK;
3822 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
Joe Perches1dc32912008-07-11 15:17:08 -07003823 ew32(LEDCTL, led_ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003824 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003825
3826 /* Wait for FW to finish PHY configuration. */
3827 ret_val = e1000_get_phy_cfg_done(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07003828 if (ret_val != E1000_SUCCESS)
3829 return ret_val;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08003830 e1000_release_software_semaphore(hw);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003831
Auke Kok8fc897b2006-08-28 14:56:16 -07003832 if ((hw->mac_type == e1000_ich8lan) && (hw->phy_type == e1000_phy_igp_3))
3833 ret_val = e1000_init_lcd_from_nvm(hw);
3834
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003835 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003836}
3837
3838/******************************************************************************
3839* Resets the PHY
3840*
3841* hw - Struct containing variables accessed by shared code
3842*
Matt LaPlante0779bf22006-11-30 05:24:39 +01003843* Sets bit 15 of the MII Control register
Linus Torvalds1da177e2005-04-16 15:20:36 -07003844******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003845s32 e1000_phy_reset(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003846{
Joe Perches406874a2008-04-03 10:06:32 -07003847 s32 ret_val;
3848 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003849
3850 DEBUGFUNC("e1000_phy_reset");
3851
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003852 /* In the case of the phy reset being blocked, it's not an error, we
3853 * simply return success without performing the reset. */
3854 ret_val = e1000_check_phy_reset_block(hw);
3855 if (ret_val)
3856 return E1000_SUCCESS;
3857
Jeff Kirsher2a88c172006-09-27 12:54:05 -07003858 switch (hw->phy_type) {
3859 case e1000_phy_igp:
3860 case e1000_phy_igp_2:
3861 case e1000_phy_igp_3:
3862 case e1000_phy_ife:
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003863 ret_val = e1000_phy_hw_reset(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07003864 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003865 return ret_val;
3866 break;
3867 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003868 ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07003869 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003870 return ret_val;
3871
3872 phy_data |= MII_CR_RESET;
3873 ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07003874 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003875 return ret_val;
3876
3877 udelay(1);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07003878 break;
3879 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003880
Auke Kok8fc897b2006-08-28 14:56:16 -07003881 if (hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003882 e1000_phy_init_script(hw);
3883
3884 return E1000_SUCCESS;
3885}
3886
3887/******************************************************************************
Auke Kokd37ea5d2006-06-27 09:08:17 -07003888* Work-around for 82566 power-down: on D3 entry-
3889* 1) disable gigabit link
3890* 2) write VR power-down enable
3891* 3) read it back
3892* if successful continue, else issue LCD reset and repeat
3893*
3894* hw - struct containing variables accessed by shared code
3895******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003896void e1000_phy_powerdown_workaround(struct e1000_hw *hw)
Auke Kokd37ea5d2006-06-27 09:08:17 -07003897{
Joe Perches406874a2008-04-03 10:06:32 -07003898 s32 reg;
3899 u16 phy_data;
3900 s32 retry = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07003901
3902 DEBUGFUNC("e1000_phy_powerdown_workaround");
3903
3904 if (hw->phy_type != e1000_phy_igp_3)
3905 return;
3906
3907 do {
3908 /* Disable link */
Joe Perches1dc32912008-07-11 15:17:08 -07003909 reg = er32(PHY_CTRL);
3910 ew32(PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE |
Auke Kokd37ea5d2006-06-27 09:08:17 -07003911 E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
3912
Jeff Kirsher070f6ff2006-11-01 08:47:44 -08003913 /* Write VR power-down enable - bits 9:8 should be 10b */
Auke Kokd37ea5d2006-06-27 09:08:17 -07003914 e1000_read_phy_reg(hw, IGP3_VR_CTRL, &phy_data);
Jeff Kirsher070f6ff2006-11-01 08:47:44 -08003915 phy_data |= (1 << 9);
3916 phy_data &= ~(1 << 8);
3917 e1000_write_phy_reg(hw, IGP3_VR_CTRL, phy_data);
Auke Kokd37ea5d2006-06-27 09:08:17 -07003918
3919 /* Read it back and test */
3920 e1000_read_phy_reg(hw, IGP3_VR_CTRL, &phy_data);
Jeff Kirsher070f6ff2006-11-01 08:47:44 -08003921 if (((phy_data & IGP3_VR_CTRL_MODE_MASK) == IGP3_VR_CTRL_MODE_SHUT) || retry)
Auke Kokd37ea5d2006-06-27 09:08:17 -07003922 break;
3923
3924 /* Issue PHY reset and repeat at most one more time */
Joe Perches1dc32912008-07-11 15:17:08 -07003925 reg = er32(CTRL);
3926 ew32(CTRL, reg | E1000_CTRL_PHY_RST);
Auke Kokd37ea5d2006-06-27 09:08:17 -07003927 retry++;
3928 } while (retry);
3929
3930 return;
3931
3932}
3933
3934/******************************************************************************
3935* Work-around for 82566 Kumeran PCS lock loss:
3936* On link status change (i.e. PCI reset, speed change) and link is up and
3937* speed is gigabit-
3938* 0) if workaround is optionally disabled do nothing
3939* 1) wait 1ms for Kumeran link to come up
3940* 2) check Kumeran Diagnostic register PCS lock loss bit
3941* 3) if not set the link is locked (all is good), otherwise...
3942* 4) reset the PHY
3943* 5) repeat up to 10 times
3944* Note: this is only called for IGP3 copper when speed is 1gb.
3945*
3946* hw - struct containing variables accessed by shared code
3947******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07003948static s32 e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw)
Auke Kokd37ea5d2006-06-27 09:08:17 -07003949{
Joe Perches406874a2008-04-03 10:06:32 -07003950 s32 ret_val;
3951 s32 reg;
3952 s32 cnt;
3953 u16 phy_data;
Auke Kokd37ea5d2006-06-27 09:08:17 -07003954
3955 if (hw->kmrn_lock_loss_workaround_disabled)
3956 return E1000_SUCCESS;
3957
Auke Kok8fc897b2006-08-28 14:56:16 -07003958 /* Make sure link is up before proceeding. If not just return.
3959 * Attempting this while link is negotiating fouled up link
Auke Kokd37ea5d2006-06-27 09:08:17 -07003960 * stability */
3961 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
3962 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
3963
3964 if (phy_data & MII_SR_LINK_STATUS) {
3965 for (cnt = 0; cnt < 10; cnt++) {
3966 /* read once to clear */
3967 ret_val = e1000_read_phy_reg(hw, IGP3_KMRN_DIAG, &phy_data);
3968 if (ret_val)
3969 return ret_val;
3970 /* and again to get new status */
3971 ret_val = e1000_read_phy_reg(hw, IGP3_KMRN_DIAG, &phy_data);
3972 if (ret_val)
3973 return ret_val;
3974
3975 /* check for PCS lock */
3976 if (!(phy_data & IGP3_KMRN_DIAG_PCS_LOCK_LOSS))
3977 return E1000_SUCCESS;
3978
3979 /* Issue PHY reset */
3980 e1000_phy_hw_reset(hw);
Jeff Garzikf8ec4732006-09-19 15:27:07 -04003981 mdelay(5);
Auke Kokd37ea5d2006-06-27 09:08:17 -07003982 }
3983 /* Disable GigE link negotiation */
Joe Perches1dc32912008-07-11 15:17:08 -07003984 reg = er32(PHY_CTRL);
3985 ew32(PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE |
Auke Kokd37ea5d2006-06-27 09:08:17 -07003986 E1000_PHY_CTRL_NOND0A_GBE_DISABLE);
3987
3988 /* unable to acquire PCS lock */
3989 return E1000_ERR_PHY;
3990 }
3991
3992 return E1000_SUCCESS;
3993}
3994
3995/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07003996* Probes the expected PHY address for known PHY IDs
3997*
3998* hw - Struct containing variables accessed by shared code
3999******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004000static s32 e1000_detect_gig_phy(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004001{
Joe Perches406874a2008-04-03 10:06:32 -07004002 s32 phy_init_status, ret_val;
4003 u16 phy_id_high, phy_id_low;
Joe Perchesc3033b02008-03-21 11:06:25 -07004004 bool match = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004005
4006 DEBUGFUNC("e1000_detect_gig_phy");
4007
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004008 if (hw->phy_id != 0)
4009 return E1000_SUCCESS;
4010
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004011 /* The 82571 firmware may still be configuring the PHY. In this
4012 * case, we cannot access the PHY until the configuration is done. So
4013 * we explicitly set the PHY values. */
Auke Kokcd94dd02006-06-27 09:08:22 -07004014 if (hw->mac_type == e1000_82571 ||
4015 hw->mac_type == e1000_82572) {
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004016 hw->phy_id = IGP01E1000_I_PHY_ID;
4017 hw->phy_type = e1000_phy_igp_2;
4018 return E1000_SUCCESS;
4019 }
4020
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004021 /* ESB-2 PHY reads require e1000_phy_gg82563 to be set because of a work-
4022 * around that forces PHY page 0 to be set or the reads fail. The rest of
4023 * the code in this routine uses e1000_read_phy_reg to read the PHY ID.
4024 * So for ESB-2 we need to have this set so our reads won't fail. If the
4025 * attached PHY is not a e1000_phy_gg82563, the routines below will figure
4026 * this out as well. */
4027 if (hw->mac_type == e1000_80003es2lan)
4028 hw->phy_type = e1000_phy_gg82563;
4029
Linus Torvalds1da177e2005-04-16 15:20:36 -07004030 /* Read the PHY ID Registers to identify which PHY is onboard. */
4031 ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high);
Auke Kokcd94dd02006-06-27 09:08:22 -07004032 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004033 return ret_val;
4034
Joe Perchese982f172008-07-11 15:17:18 -07004035 hw->phy_id = (u32)(phy_id_high << 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004036 udelay(20);
4037 ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low);
Auke Kok8fc897b2006-08-28 14:56:16 -07004038 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004039 return ret_val;
4040
Joe Perchese982f172008-07-11 15:17:18 -07004041 hw->phy_id |= (u32)(phy_id_low & PHY_REVISION_MASK);
4042 hw->phy_revision = (u32)phy_id_low & ~PHY_REVISION_MASK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004043
Auke Kok8fc897b2006-08-28 14:56:16 -07004044 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004045 case e1000_82543:
Joe Perchesc3033b02008-03-21 11:06:25 -07004046 if (hw->phy_id == M88E1000_E_PHY_ID) match = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004047 break;
4048 case e1000_82544:
Joe Perchesc3033b02008-03-21 11:06:25 -07004049 if (hw->phy_id == M88E1000_I_PHY_ID) match = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004050 break;
4051 case e1000_82540:
4052 case e1000_82545:
4053 case e1000_82545_rev_3:
4054 case e1000_82546:
4055 case e1000_82546_rev_3:
Joe Perchesc3033b02008-03-21 11:06:25 -07004056 if (hw->phy_id == M88E1011_I_PHY_ID) match = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004057 break;
4058 case e1000_82541:
4059 case e1000_82541_rev_2:
4060 case e1000_82547:
4061 case e1000_82547_rev_2:
Joe Perchesc3033b02008-03-21 11:06:25 -07004062 if (hw->phy_id == IGP01E1000_I_PHY_ID) match = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004063 break;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004064 case e1000_82573:
Joe Perchesc3033b02008-03-21 11:06:25 -07004065 if (hw->phy_id == M88E1111_I_PHY_ID) match = true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004066 break;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004067 case e1000_80003es2lan:
Joe Perchesc3033b02008-03-21 11:06:25 -07004068 if (hw->phy_id == GG82563_E_PHY_ID) match = true;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004069 break;
Auke Kokcd94dd02006-06-27 09:08:22 -07004070 case e1000_ich8lan:
Joe Perchesc3033b02008-03-21 11:06:25 -07004071 if (hw->phy_id == IGP03E1000_E_PHY_ID) match = true;
4072 if (hw->phy_id == IFE_E_PHY_ID) match = true;
4073 if (hw->phy_id == IFE_PLUS_E_PHY_ID) match = true;
4074 if (hw->phy_id == IFE_C_E_PHY_ID) match = true;
Auke Kokcd94dd02006-06-27 09:08:22 -07004075 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004076 default:
4077 DEBUGOUT1("Invalid MAC type %d\n", hw->mac_type);
4078 return -E1000_ERR_CONFIG;
4079 }
4080 phy_init_status = e1000_set_phy_type(hw);
4081
4082 if ((match) && (phy_init_status == E1000_SUCCESS)) {
4083 DEBUGOUT1("PHY ID 0x%X detected\n", hw->phy_id);
4084 return E1000_SUCCESS;
4085 }
4086 DEBUGOUT1("Invalid PHY ID 0x%X\n", hw->phy_id);
4087 return -E1000_ERR_PHY;
4088}
4089
4090/******************************************************************************
4091* Resets the PHY's DSP
4092*
4093* hw - Struct containing variables accessed by shared code
4094******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004095static s32 e1000_phy_reset_dsp(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004096{
Joe Perches406874a2008-04-03 10:06:32 -07004097 s32 ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004098 DEBUGFUNC("e1000_phy_reset_dsp");
4099
4100 do {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004101 if (hw->phy_type != e1000_phy_gg82563) {
4102 ret_val = e1000_write_phy_reg(hw, 29, 0x001d);
Auke Kok8fc897b2006-08-28 14:56:16 -07004103 if (ret_val) break;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004104 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004105 ret_val = e1000_write_phy_reg(hw, 30, 0x00c1);
Auke Kok8fc897b2006-08-28 14:56:16 -07004106 if (ret_val) break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004107 ret_val = e1000_write_phy_reg(hw, 30, 0x0000);
Auke Kok8fc897b2006-08-28 14:56:16 -07004108 if (ret_val) break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004109 ret_val = E1000_SUCCESS;
Auke Kok8fc897b2006-08-28 14:56:16 -07004110 } while (0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004111
4112 return ret_val;
4113}
4114
4115/******************************************************************************
4116* Get PHY information from various PHY registers for igp PHY only.
4117*
4118* hw - Struct containing variables accessed by shared code
4119* phy_info - PHY information structure
4120******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004121static s32 e1000_phy_igp_get_info(struct e1000_hw *hw,
4122 struct e1000_phy_info *phy_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004123{
Joe Perches406874a2008-04-03 10:06:32 -07004124 s32 ret_val;
4125 u16 phy_data, min_length, max_length, average;
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004126 e1000_rev_polarity polarity;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004127
4128 DEBUGFUNC("e1000_phy_igp_get_info");
4129
4130 /* The downshift status is checked only once, after link is established,
4131 * and it stored in the hw->speed_downgraded parameter. */
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004132 phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004133
4134 /* IGP01E1000 does not need to support it. */
4135 phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_normal;
4136
4137 /* IGP01E1000 always correct polarity reversal */
4138 phy_info->polarity_correction = e1000_polarity_reversal_enabled;
4139
4140 /* Check polarity status */
4141 ret_val = e1000_check_polarity(hw, &polarity);
Auke Kok8fc897b2006-08-28 14:56:16 -07004142 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004143 return ret_val;
4144
4145 phy_info->cable_polarity = polarity;
4146
4147 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07004148 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004149 return ret_val;
4150
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004151 phy_info->mdix_mode = (e1000_auto_x_mode)((phy_data & IGP01E1000_PSSR_MDIX) >>
4152 IGP01E1000_PSSR_MDIX_SHIFT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004153
Auke Kok8fc897b2006-08-28 14:56:16 -07004154 if ((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==
Linus Torvalds1da177e2005-04-16 15:20:36 -07004155 IGP01E1000_PSSR_SPEED_1000MBPS) {
4156 /* Local/Remote Receiver Information are only valid at 1000 Mbps */
4157 ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07004158 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004159 return ret_val;
4160
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004161 phy_info->local_rx = ((phy_data & SR_1000T_LOCAL_RX_STATUS) >>
4162 SR_1000T_LOCAL_RX_STATUS_SHIFT) ?
4163 e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
4164 phy_info->remote_rx = ((phy_data & SR_1000T_REMOTE_RX_STATUS) >>
4165 SR_1000T_REMOTE_RX_STATUS_SHIFT) ?
4166 e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004167
4168 /* Get cable length */
4169 ret_val = e1000_get_cable_length(hw, &min_length, &max_length);
Auke Kok8fc897b2006-08-28 14:56:16 -07004170 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004171 return ret_val;
4172
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004173 /* Translate to old method */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004174 average = (max_length + min_length) / 2;
4175
Auke Kok8fc897b2006-08-28 14:56:16 -07004176 if (average <= e1000_igp_cable_length_50)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004177 phy_info->cable_length = e1000_cable_length_50;
Auke Kok8fc897b2006-08-28 14:56:16 -07004178 else if (average <= e1000_igp_cable_length_80)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004179 phy_info->cable_length = e1000_cable_length_50_80;
Auke Kok8fc897b2006-08-28 14:56:16 -07004180 else if (average <= e1000_igp_cable_length_110)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004181 phy_info->cable_length = e1000_cable_length_80_110;
Auke Kok8fc897b2006-08-28 14:56:16 -07004182 else if (average <= e1000_igp_cable_length_140)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004183 phy_info->cable_length = e1000_cable_length_110_140;
4184 else
4185 phy_info->cable_length = e1000_cable_length_140;
4186 }
4187
4188 return E1000_SUCCESS;
4189}
4190
4191/******************************************************************************
Auke Kokd37ea5d2006-06-27 09:08:17 -07004192* Get PHY information from various PHY registers for ife PHY only.
4193*
4194* hw - Struct containing variables accessed by shared code
4195* phy_info - PHY information structure
4196******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004197static s32 e1000_phy_ife_get_info(struct e1000_hw *hw,
4198 struct e1000_phy_info *phy_info)
Auke Kokd37ea5d2006-06-27 09:08:17 -07004199{
Joe Perches406874a2008-04-03 10:06:32 -07004200 s32 ret_val;
4201 u16 phy_data;
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004202 e1000_rev_polarity polarity;
Auke Kokd37ea5d2006-06-27 09:08:17 -07004203
4204 DEBUGFUNC("e1000_phy_ife_get_info");
4205
4206 phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
4207 phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_normal;
4208
4209 ret_val = e1000_read_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL, &phy_data);
4210 if (ret_val)
4211 return ret_val;
4212 phy_info->polarity_correction =
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004213 ((phy_data & IFE_PSC_AUTO_POLARITY_DISABLE) >>
4214 IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT) ?
4215 e1000_polarity_reversal_disabled : e1000_polarity_reversal_enabled;
Auke Kokd37ea5d2006-06-27 09:08:17 -07004216
4217 if (phy_info->polarity_correction == e1000_polarity_reversal_enabled) {
4218 ret_val = e1000_check_polarity(hw, &polarity);
4219 if (ret_val)
4220 return ret_val;
4221 } else {
4222 /* Polarity is forced. */
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004223 polarity = ((phy_data & IFE_PSC_FORCE_POLARITY) >>
4224 IFE_PSC_FORCE_POLARITY_SHIFT) ?
4225 e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
Auke Kokd37ea5d2006-06-27 09:08:17 -07004226 }
4227 phy_info->cable_polarity = polarity;
4228
4229 ret_val = e1000_read_phy_reg(hw, IFE_PHY_MDIX_CONTROL, &phy_data);
4230 if (ret_val)
4231 return ret_val;
4232
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004233 phy_info->mdix_mode = (e1000_auto_x_mode)
4234 ((phy_data & (IFE_PMC_AUTO_MDIX | IFE_PMC_FORCE_MDIX)) >>
4235 IFE_PMC_MDIX_MODE_SHIFT);
Auke Kokd37ea5d2006-06-27 09:08:17 -07004236
4237 return E1000_SUCCESS;
4238}
4239
4240/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07004241* Get PHY information from various PHY registers fot m88 PHY only.
4242*
4243* hw - Struct containing variables accessed by shared code
4244* phy_info - PHY information structure
4245******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004246static s32 e1000_phy_m88_get_info(struct e1000_hw *hw,
4247 struct e1000_phy_info *phy_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004248{
Joe Perches406874a2008-04-03 10:06:32 -07004249 s32 ret_val;
4250 u16 phy_data;
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004251 e1000_rev_polarity polarity;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004252
4253 DEBUGFUNC("e1000_phy_m88_get_info");
4254
4255 /* The downshift status is checked only once, after link is established,
4256 * and it stored in the hw->speed_downgraded parameter. */
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004257 phy_info->downshift = (e1000_downshift)hw->speed_downgraded;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004258
4259 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07004260 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004261 return ret_val;
4262
4263 phy_info->extended_10bt_distance =
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004264 ((phy_data & M88E1000_PSCR_10BT_EXT_DIST_ENABLE) >>
4265 M88E1000_PSCR_10BT_EXT_DIST_ENABLE_SHIFT) ?
4266 e1000_10bt_ext_dist_enable_lower : e1000_10bt_ext_dist_enable_normal;
4267
Linus Torvalds1da177e2005-04-16 15:20:36 -07004268 phy_info->polarity_correction =
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004269 ((phy_data & M88E1000_PSCR_POLARITY_REVERSAL) >>
4270 M88E1000_PSCR_POLARITY_REVERSAL_SHIFT) ?
4271 e1000_polarity_reversal_disabled : e1000_polarity_reversal_enabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004272
4273 /* Check polarity status */
4274 ret_val = e1000_check_polarity(hw, &polarity);
Auke Kok8fc897b2006-08-28 14:56:16 -07004275 if (ret_val)
Auke Kok76c224b2006-05-23 13:36:06 -07004276 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277 phy_info->cable_polarity = polarity;
4278
4279 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07004280 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281 return ret_val;
4282
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004283 phy_info->mdix_mode = (e1000_auto_x_mode)((phy_data & M88E1000_PSSR_MDIX) >>
4284 M88E1000_PSSR_MDIX_SHIFT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004285
4286 if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) {
4287 /* Cable Length Estimation and Local/Remote Receiver Information
4288 * are only valid at 1000 Mbps.
4289 */
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004290 if (hw->phy_type != e1000_phy_gg82563) {
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004291 phy_info->cable_length = (e1000_cable_length)((phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004292 M88E1000_PSSR_CABLE_LENGTH_SHIFT);
4293 } else {
4294 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE,
4295 &phy_data);
4296 if (ret_val)
4297 return ret_val;
4298
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004299 phy_info->cable_length = (e1000_cable_length)(phy_data & GG82563_DSPD_CABLE_LENGTH);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004300 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004301
4302 ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07004303 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304 return ret_val;
4305
Jeff Kirsher70c6f302006-09-27 12:53:31 -07004306 phy_info->local_rx = ((phy_data & SR_1000T_LOCAL_RX_STATUS) >>
4307 SR_1000T_LOCAL_RX_STATUS_SHIFT) ?
4308 e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
4309 phy_info->remote_rx = ((phy_data & SR_1000T_REMOTE_RX_STATUS) >>
4310 SR_1000T_REMOTE_RX_STATUS_SHIFT) ?
4311 e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004312
Linus Torvalds1da177e2005-04-16 15:20:36 -07004313 }
4314
4315 return E1000_SUCCESS;
4316}
4317
4318/******************************************************************************
4319* Get PHY information from various PHY registers
4320*
4321* hw - Struct containing variables accessed by shared code
4322* phy_info - PHY information structure
4323******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004324s32 e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004325{
Joe Perches406874a2008-04-03 10:06:32 -07004326 s32 ret_val;
4327 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004328
4329 DEBUGFUNC("e1000_phy_get_info");
4330
4331 phy_info->cable_length = e1000_cable_length_undefined;
4332 phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_undefined;
4333 phy_info->cable_polarity = e1000_rev_polarity_undefined;
4334 phy_info->downshift = e1000_downshift_undefined;
4335 phy_info->polarity_correction = e1000_polarity_reversal_undefined;
4336 phy_info->mdix_mode = e1000_auto_x_mode_undefined;
4337 phy_info->local_rx = e1000_1000t_rx_status_undefined;
4338 phy_info->remote_rx = e1000_1000t_rx_status_undefined;
4339
Auke Kok8fc897b2006-08-28 14:56:16 -07004340 if (hw->media_type != e1000_media_type_copper) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004341 DEBUGOUT("PHY info is only valid for copper media\n");
4342 return -E1000_ERR_CONFIG;
4343 }
4344
4345 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07004346 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004347 return ret_val;
4348
4349 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07004350 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004351 return ret_val;
4352
Auke Kok8fc897b2006-08-28 14:56:16 -07004353 if ((phy_data & MII_SR_LINK_STATUS) != MII_SR_LINK_STATUS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004354 DEBUGOUT("PHY info is only valid if link is up\n");
4355 return -E1000_ERR_CONFIG;
4356 }
4357
Auke Kokcd94dd02006-06-27 09:08:22 -07004358 if (hw->phy_type == e1000_phy_igp ||
4359 hw->phy_type == e1000_phy_igp_3 ||
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004360 hw->phy_type == e1000_phy_igp_2)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004361 return e1000_phy_igp_get_info(hw, phy_info);
Auke Kokcd94dd02006-06-27 09:08:22 -07004362 else if (hw->phy_type == e1000_phy_ife)
4363 return e1000_phy_ife_get_info(hw, phy_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004364 else
4365 return e1000_phy_m88_get_info(hw, phy_info);
4366}
4367
Joe Perches64798842008-07-11 15:17:02 -07004368s32 e1000_validate_mdi_setting(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004369{
4370 DEBUGFUNC("e1000_validate_mdi_settings");
4371
Auke Kok8fc897b2006-08-28 14:56:16 -07004372 if (!hw->autoneg && (hw->mdix == 0 || hw->mdix == 3)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004373 DEBUGOUT("Invalid MDI setting detected\n");
4374 hw->mdix = 1;
4375 return -E1000_ERR_CONFIG;
4376 }
4377 return E1000_SUCCESS;
4378}
4379
4380
4381/******************************************************************************
4382 * Sets up eeprom variables in the hw struct. Must be called after mac_type
Jeff Kirsher0f15a8f2006-03-02 18:46:29 -08004383 * is configured. Additionally, if this is ICH8, the flash controller GbE
4384 * registers must be mapped, or this will crash.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004385 *
4386 * hw - Struct containing variables accessed by shared code
4387 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004388s32 e1000_init_eeprom_params(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004389{
4390 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches1dc32912008-07-11 15:17:08 -07004391 u32 eecd = er32(EECD);
Joe Perches406874a2008-04-03 10:06:32 -07004392 s32 ret_val = E1000_SUCCESS;
4393 u16 eeprom_size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004394
4395 DEBUGFUNC("e1000_init_eeprom_params");
4396
4397 switch (hw->mac_type) {
4398 case e1000_82542_rev2_0:
4399 case e1000_82542_rev2_1:
4400 case e1000_82543:
4401 case e1000_82544:
4402 eeprom->type = e1000_eeprom_microwire;
4403 eeprom->word_size = 64;
4404 eeprom->opcode_bits = 3;
4405 eeprom->address_bits = 6;
4406 eeprom->delay_usec = 50;
Joe Perchesc3033b02008-03-21 11:06:25 -07004407 eeprom->use_eerd = false;
4408 eeprom->use_eewr = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004409 break;
4410 case e1000_82540:
4411 case e1000_82545:
4412 case e1000_82545_rev_3:
4413 case e1000_82546:
4414 case e1000_82546_rev_3:
4415 eeprom->type = e1000_eeprom_microwire;
4416 eeprom->opcode_bits = 3;
4417 eeprom->delay_usec = 50;
Auke Kok8fc897b2006-08-28 14:56:16 -07004418 if (eecd & E1000_EECD_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004419 eeprom->word_size = 256;
4420 eeprom->address_bits = 8;
4421 } else {
4422 eeprom->word_size = 64;
4423 eeprom->address_bits = 6;
4424 }
Joe Perchesc3033b02008-03-21 11:06:25 -07004425 eeprom->use_eerd = false;
4426 eeprom->use_eewr = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004427 break;
4428 case e1000_82541:
4429 case e1000_82541_rev_2:
4430 case e1000_82547:
4431 case e1000_82547_rev_2:
4432 if (eecd & E1000_EECD_TYPE) {
4433 eeprom->type = e1000_eeprom_spi;
4434 eeprom->opcode_bits = 8;
4435 eeprom->delay_usec = 1;
4436 if (eecd & E1000_EECD_ADDR_BITS) {
4437 eeprom->page_size = 32;
4438 eeprom->address_bits = 16;
4439 } else {
4440 eeprom->page_size = 8;
4441 eeprom->address_bits = 8;
4442 }
4443 } else {
4444 eeprom->type = e1000_eeprom_microwire;
4445 eeprom->opcode_bits = 3;
4446 eeprom->delay_usec = 50;
4447 if (eecd & E1000_EECD_ADDR_BITS) {
4448 eeprom->word_size = 256;
4449 eeprom->address_bits = 8;
4450 } else {
4451 eeprom->word_size = 64;
4452 eeprom->address_bits = 6;
4453 }
4454 }
Joe Perchesc3033b02008-03-21 11:06:25 -07004455 eeprom->use_eerd = false;
4456 eeprom->use_eewr = false;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004457 break;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004458 case e1000_82571:
4459 case e1000_82572:
4460 eeprom->type = e1000_eeprom_spi;
4461 eeprom->opcode_bits = 8;
4462 eeprom->delay_usec = 1;
4463 if (eecd & E1000_EECD_ADDR_BITS) {
4464 eeprom->page_size = 32;
4465 eeprom->address_bits = 16;
4466 } else {
4467 eeprom->page_size = 8;
4468 eeprom->address_bits = 8;
4469 }
Joe Perchesc3033b02008-03-21 11:06:25 -07004470 eeprom->use_eerd = false;
4471 eeprom->use_eewr = false;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004472 break;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004473 case e1000_82573:
4474 eeprom->type = e1000_eeprom_spi;
4475 eeprom->opcode_bits = 8;
4476 eeprom->delay_usec = 1;
4477 if (eecd & E1000_EECD_ADDR_BITS) {
4478 eeprom->page_size = 32;
4479 eeprom->address_bits = 16;
4480 } else {
4481 eeprom->page_size = 8;
4482 eeprom->address_bits = 8;
4483 }
Joe Perchesc3033b02008-03-21 11:06:25 -07004484 eeprom->use_eerd = true;
4485 eeprom->use_eewr = true;
4486 if (!e1000_is_onboard_nvm_eeprom(hw)) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004487 eeprom->type = e1000_eeprom_flash;
4488 eeprom->word_size = 2048;
4489
4490 /* Ensure that the Autonomous FLASH update bit is cleared due to
4491 * Flash update issue on parts which use a FLASH for NVM. */
4492 eecd &= ~E1000_EECD_AUPDEN;
Joe Perches1dc32912008-07-11 15:17:08 -07004493 ew32(EECD, eecd);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004494 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004495 break;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004496 case e1000_80003es2lan:
4497 eeprom->type = e1000_eeprom_spi;
4498 eeprom->opcode_bits = 8;
4499 eeprom->delay_usec = 1;
4500 if (eecd & E1000_EECD_ADDR_BITS) {
4501 eeprom->page_size = 32;
4502 eeprom->address_bits = 16;
4503 } else {
4504 eeprom->page_size = 8;
4505 eeprom->address_bits = 8;
4506 }
Joe Perchesc3033b02008-03-21 11:06:25 -07004507 eeprom->use_eerd = true;
4508 eeprom->use_eewr = false;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004509 break;
Auke Kokcd94dd02006-06-27 09:08:22 -07004510 case e1000_ich8lan:
Nicholas Nunley35574762006-09-27 12:53:34 -07004511 {
Joe Perches406874a2008-04-03 10:06:32 -07004512 s32 i = 0;
4513 u32 flash_size = E1000_READ_ICH_FLASH_REG(hw, ICH_FLASH_GFPREG);
Auke Kokcd94dd02006-06-27 09:08:22 -07004514
4515 eeprom->type = e1000_eeprom_ich8;
Joe Perchesc3033b02008-03-21 11:06:25 -07004516 eeprom->use_eerd = false;
4517 eeprom->use_eewr = false;
Auke Kokcd94dd02006-06-27 09:08:22 -07004518 eeprom->word_size = E1000_SHADOW_RAM_WORDS;
4519
4520 /* Zero the shadow RAM structure. But don't load it from NVM
4521 * so as to save time for driver init */
4522 if (hw->eeprom_shadow_ram != NULL) {
4523 for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) {
Joe Perchesc3033b02008-03-21 11:06:25 -07004524 hw->eeprom_shadow_ram[i].modified = false;
Auke Kokcd94dd02006-06-27 09:08:22 -07004525 hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF;
4526 }
4527 }
4528
Jeff Kirsher2df7d592006-11-01 08:48:02 -08004529 hw->flash_base_addr = (flash_size & ICH_GFPREG_BASE_MASK) *
4530 ICH_FLASH_SECTOR_SIZE;
Auke Kokcd94dd02006-06-27 09:08:22 -07004531
Jeff Kirsher2df7d592006-11-01 08:48:02 -08004532 hw->flash_bank_size = ((flash_size >> 16) & ICH_GFPREG_BASE_MASK) + 1;
4533 hw->flash_bank_size -= (flash_size & ICH_GFPREG_BASE_MASK);
4534
4535 hw->flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
4536
Joe Perches406874a2008-04-03 10:06:32 -07004537 hw->flash_bank_size /= 2 * sizeof(u16);
Auke Kokcd94dd02006-06-27 09:08:22 -07004538
4539 break;
Nicholas Nunley35574762006-09-27 12:53:34 -07004540 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004541 default:
4542 break;
4543 }
4544
4545 if (eeprom->type == e1000_eeprom_spi) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004546 /* eeprom_size will be an enum [0..8] that maps to eeprom sizes 128B to
4547 * 32KB (incremented by powers of 2).
4548 */
Auke Kok8fc897b2006-08-28 14:56:16 -07004549 if (hw->mac_type <= e1000_82547_rev_2) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004550 /* Set to default value for initial eeprom read. */
4551 eeprom->word_size = 64;
4552 ret_val = e1000_read_eeprom(hw, EEPROM_CFG, 1, &eeprom_size);
Auke Kok8fc897b2006-08-28 14:56:16 -07004553 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004554 return ret_val;
4555 eeprom_size = (eeprom_size & EEPROM_SIZE_MASK) >> EEPROM_SIZE_SHIFT;
4556 /* 256B eeprom size was not supported in earlier hardware, so we
4557 * bump eeprom_size up one to ensure that "1" (which maps to 256B)
4558 * is never the result used in the shifting logic below. */
Auke Kok8fc897b2006-08-28 14:56:16 -07004559 if (eeprom_size)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004560 eeprom_size++;
4561 } else {
Joe Perches406874a2008-04-03 10:06:32 -07004562 eeprom_size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >>
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004563 E1000_EECD_SIZE_EX_SHIFT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004564 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004565
4566 eeprom->word_size = 1 << (eeprom_size + EEPROM_WORD_SIZE_SHIFT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004567 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004568 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004569}
4570
4571/******************************************************************************
4572 * Raises the EEPROM's clock input.
4573 *
4574 * hw - Struct containing variables accessed by shared code
4575 * eecd - EECD's current value
4576 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004577static void e1000_raise_ee_clk(struct e1000_hw *hw, u32 *eecd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004578{
4579 /* Raise the clock input to the EEPROM (by setting the SK bit), and then
4580 * wait <delay> microseconds.
4581 */
4582 *eecd = *eecd | E1000_EECD_SK;
Joe Perches1dc32912008-07-11 15:17:08 -07004583 ew32(EECD, *eecd);
4584 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004585 udelay(hw->eeprom.delay_usec);
4586}
4587
4588/******************************************************************************
4589 * Lowers the EEPROM's clock input.
4590 *
4591 * hw - Struct containing variables accessed by shared code
4592 * eecd - EECD's current value
4593 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004594static void e1000_lower_ee_clk(struct e1000_hw *hw, u32 *eecd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004595{
4596 /* Lower the clock input to the EEPROM (by clearing the SK bit), and then
4597 * wait 50 microseconds.
4598 */
4599 *eecd = *eecd & ~E1000_EECD_SK;
Joe Perches1dc32912008-07-11 15:17:08 -07004600 ew32(EECD, *eecd);
4601 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004602 udelay(hw->eeprom.delay_usec);
4603}
4604
4605/******************************************************************************
4606 * Shift data bits out to the EEPROM.
4607 *
4608 * hw - Struct containing variables accessed by shared code
4609 * data - data to send to the EEPROM
4610 * count - number of bits to shift out
4611 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004612static void e1000_shift_out_ee_bits(struct e1000_hw *hw, u16 data, u16 count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004613{
4614 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches406874a2008-04-03 10:06:32 -07004615 u32 eecd;
4616 u32 mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004617
4618 /* We need to shift "count" bits out to the EEPROM. So, value in the
4619 * "data" parameter will be shifted out to the EEPROM one bit at a time.
4620 * In order to do this, "data" must be broken down into bits.
4621 */
4622 mask = 0x01 << (count - 1);
Joe Perches1dc32912008-07-11 15:17:08 -07004623 eecd = er32(EECD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004624 if (eeprom->type == e1000_eeprom_microwire) {
4625 eecd &= ~E1000_EECD_DO;
4626 } else if (eeprom->type == e1000_eeprom_spi) {
4627 eecd |= E1000_EECD_DO;
4628 }
4629 do {
4630 /* A "1" is shifted out to the EEPROM by setting bit "DI" to a "1",
4631 * and then raising and then lowering the clock (the SK bit controls
4632 * the clock input to the EEPROM). A "0" is shifted out to the EEPROM
4633 * by setting "DI" to "0" and then raising and then lowering the clock.
4634 */
4635 eecd &= ~E1000_EECD_DI;
4636
Auke Kok8fc897b2006-08-28 14:56:16 -07004637 if (data & mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004638 eecd |= E1000_EECD_DI;
4639
Joe Perches1dc32912008-07-11 15:17:08 -07004640 ew32(EECD, eecd);
4641 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004642
4643 udelay(eeprom->delay_usec);
4644
4645 e1000_raise_ee_clk(hw, &eecd);
4646 e1000_lower_ee_clk(hw, &eecd);
4647
4648 mask = mask >> 1;
4649
Auke Kok8fc897b2006-08-28 14:56:16 -07004650 } while (mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004651
4652 /* We leave the "DI" bit set to "0" when we leave this routine. */
4653 eecd &= ~E1000_EECD_DI;
Joe Perches1dc32912008-07-11 15:17:08 -07004654 ew32(EECD, eecd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004655}
4656
4657/******************************************************************************
4658 * Shift data bits in from the EEPROM
4659 *
4660 * hw - Struct containing variables accessed by shared code
4661 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004662static u16 e1000_shift_in_ee_bits(struct e1000_hw *hw, u16 count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004663{
Joe Perches406874a2008-04-03 10:06:32 -07004664 u32 eecd;
4665 u32 i;
4666 u16 data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004667
4668 /* In order to read a register from the EEPROM, we need to shift 'count'
4669 * bits in from the EEPROM. Bits are "shifted in" by raising the clock
4670 * input to the EEPROM (setting the SK bit), and then reading the value of
4671 * the "DO" bit. During this "shifting in" process the "DI" bit should
4672 * always be clear.
4673 */
4674
Joe Perches1dc32912008-07-11 15:17:08 -07004675 eecd = er32(EECD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004676
4677 eecd &= ~(E1000_EECD_DO | E1000_EECD_DI);
4678 data = 0;
4679
Auke Kok8fc897b2006-08-28 14:56:16 -07004680 for (i = 0; i < count; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004681 data = data << 1;
4682 e1000_raise_ee_clk(hw, &eecd);
4683
Joe Perches1dc32912008-07-11 15:17:08 -07004684 eecd = er32(EECD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004685
4686 eecd &= ~(E1000_EECD_DI);
Auke Kok8fc897b2006-08-28 14:56:16 -07004687 if (eecd & E1000_EECD_DO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004688 data |= 1;
4689
4690 e1000_lower_ee_clk(hw, &eecd);
4691 }
4692
4693 return data;
4694}
4695
4696/******************************************************************************
4697 * Prepares EEPROM for access
4698 *
4699 * hw - Struct containing variables accessed by shared code
4700 *
4701 * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This
4702 * function should be called before issuing a command to the EEPROM.
4703 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004704static s32 e1000_acquire_eeprom(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004705{
4706 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches406874a2008-04-03 10:06:32 -07004707 u32 eecd, i=0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004708
4709 DEBUGFUNC("e1000_acquire_eeprom");
4710
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004711 if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM))
4712 return -E1000_ERR_SWFW_SYNC;
Joe Perches1dc32912008-07-11 15:17:08 -07004713 eecd = er32(EECD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004714
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004715 if (hw->mac_type != e1000_82573) {
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004716 /* Request EEPROM Access */
Auke Kok8fc897b2006-08-28 14:56:16 -07004717 if (hw->mac_type > e1000_82544) {
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004718 eecd |= E1000_EECD_REQ;
Joe Perches1dc32912008-07-11 15:17:08 -07004719 ew32(EECD, eecd);
4720 eecd = er32(EECD);
Auke Kok8fc897b2006-08-28 14:56:16 -07004721 while ((!(eecd & E1000_EECD_GNT)) &&
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004722 (i < E1000_EEPROM_GRANT_ATTEMPTS)) {
4723 i++;
4724 udelay(5);
Joe Perches1dc32912008-07-11 15:17:08 -07004725 eecd = er32(EECD);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004726 }
Auke Kok8fc897b2006-08-28 14:56:16 -07004727 if (!(eecd & E1000_EECD_GNT)) {
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004728 eecd &= ~E1000_EECD_REQ;
Joe Perches1dc32912008-07-11 15:17:08 -07004729 ew32(EECD, eecd);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004730 DEBUGOUT("Could not acquire EEPROM grant\n");
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004731 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04004732 return -E1000_ERR_EEPROM;
4733 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004734 }
4735 }
4736
4737 /* Setup EEPROM for Read/Write */
4738
4739 if (eeprom->type == e1000_eeprom_microwire) {
4740 /* Clear SK and DI */
4741 eecd &= ~(E1000_EECD_DI | E1000_EECD_SK);
Joe Perches1dc32912008-07-11 15:17:08 -07004742 ew32(EECD, eecd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004743
4744 /* Set CS */
4745 eecd |= E1000_EECD_CS;
Joe Perches1dc32912008-07-11 15:17:08 -07004746 ew32(EECD, eecd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004747 } else if (eeprom->type == e1000_eeprom_spi) {
4748 /* Clear SK and CS */
4749 eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
Joe Perches1dc32912008-07-11 15:17:08 -07004750 ew32(EECD, eecd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004751 udelay(1);
4752 }
4753
4754 return E1000_SUCCESS;
4755}
4756
4757/******************************************************************************
4758 * Returns EEPROM to a "standby" state
4759 *
4760 * hw - Struct containing variables accessed by shared code
4761 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004762static void e1000_standby_eeprom(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004763{
4764 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches406874a2008-04-03 10:06:32 -07004765 u32 eecd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004766
Joe Perches1dc32912008-07-11 15:17:08 -07004767 eecd = er32(EECD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004768
Auke Kok8fc897b2006-08-28 14:56:16 -07004769 if (eeprom->type == e1000_eeprom_microwire) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004770 eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
Joe Perches1dc32912008-07-11 15:17:08 -07004771 ew32(EECD, eecd);
4772 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004773 udelay(eeprom->delay_usec);
4774
4775 /* Clock high */
4776 eecd |= E1000_EECD_SK;
Joe Perches1dc32912008-07-11 15:17:08 -07004777 ew32(EECD, eecd);
4778 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004779 udelay(eeprom->delay_usec);
4780
4781 /* Select EEPROM */
4782 eecd |= E1000_EECD_CS;
Joe Perches1dc32912008-07-11 15:17:08 -07004783 ew32(EECD, eecd);
4784 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004785 udelay(eeprom->delay_usec);
4786
4787 /* Clock low */
4788 eecd &= ~E1000_EECD_SK;
Joe Perches1dc32912008-07-11 15:17:08 -07004789 ew32(EECD, eecd);
4790 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004791 udelay(eeprom->delay_usec);
Auke Kok8fc897b2006-08-28 14:56:16 -07004792 } else if (eeprom->type == e1000_eeprom_spi) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004793 /* Toggle CS to flush commands */
4794 eecd |= E1000_EECD_CS;
Joe Perches1dc32912008-07-11 15:17:08 -07004795 ew32(EECD, eecd);
4796 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004797 udelay(eeprom->delay_usec);
4798 eecd &= ~E1000_EECD_CS;
Joe Perches1dc32912008-07-11 15:17:08 -07004799 ew32(EECD, eecd);
4800 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004801 udelay(eeprom->delay_usec);
4802 }
4803}
4804
4805/******************************************************************************
4806 * Terminates a command by inverting the EEPROM's chip select pin
4807 *
4808 * hw - Struct containing variables accessed by shared code
4809 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004810static void e1000_release_eeprom(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004811{
Joe Perches406874a2008-04-03 10:06:32 -07004812 u32 eecd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004813
4814 DEBUGFUNC("e1000_release_eeprom");
4815
Joe Perches1dc32912008-07-11 15:17:08 -07004816 eecd = er32(EECD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004817
4818 if (hw->eeprom.type == e1000_eeprom_spi) {
4819 eecd |= E1000_EECD_CS; /* Pull CS high */
4820 eecd &= ~E1000_EECD_SK; /* Lower SCK */
4821
Joe Perches1dc32912008-07-11 15:17:08 -07004822 ew32(EECD, eecd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004823
4824 udelay(hw->eeprom.delay_usec);
Auke Kok8fc897b2006-08-28 14:56:16 -07004825 } else if (hw->eeprom.type == e1000_eeprom_microwire) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004826 /* cleanup eeprom */
4827
4828 /* CS on Microwire is active-high */
4829 eecd &= ~(E1000_EECD_CS | E1000_EECD_DI);
4830
Joe Perches1dc32912008-07-11 15:17:08 -07004831 ew32(EECD, eecd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004832
4833 /* Rising edge of clock */
4834 eecd |= E1000_EECD_SK;
Joe Perches1dc32912008-07-11 15:17:08 -07004835 ew32(EECD, eecd);
4836 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004837 udelay(hw->eeprom.delay_usec);
4838
4839 /* Falling edge of clock */
4840 eecd &= ~E1000_EECD_SK;
Joe Perches1dc32912008-07-11 15:17:08 -07004841 ew32(EECD, eecd);
4842 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004843 udelay(hw->eeprom.delay_usec);
4844 }
4845
4846 /* Stop requesting EEPROM access */
Auke Kok8fc897b2006-08-28 14:56:16 -07004847 if (hw->mac_type > e1000_82544) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004848 eecd &= ~E1000_EECD_REQ;
Joe Perches1dc32912008-07-11 15:17:08 -07004849 ew32(EECD, eecd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004850 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004851
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08004852 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004853}
4854
4855/******************************************************************************
4856 * Reads a 16 bit word from the EEPROM.
4857 *
4858 * hw - Struct containing variables accessed by shared code
4859 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004860static s32 e1000_spi_eeprom_ready(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004861{
Joe Perches406874a2008-04-03 10:06:32 -07004862 u16 retry_count = 0;
4863 u8 spi_stat_reg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004864
4865 DEBUGFUNC("e1000_spi_eeprom_ready");
4866
4867 /* Read "Status Register" repeatedly until the LSB is cleared. The
4868 * EEPROM will signal that the command has been completed by clearing
4869 * bit 0 of the internal status register. If it's not cleared within
4870 * 5 milliseconds, then error out.
4871 */
4872 retry_count = 0;
4873 do {
4874 e1000_shift_out_ee_bits(hw, EEPROM_RDSR_OPCODE_SPI,
4875 hw->eeprom.opcode_bits);
Joe Perches406874a2008-04-03 10:06:32 -07004876 spi_stat_reg = (u8)e1000_shift_in_ee_bits(hw, 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004877 if (!(spi_stat_reg & EEPROM_STATUS_RDY_SPI))
4878 break;
4879
4880 udelay(5);
4881 retry_count += 5;
4882
4883 e1000_standby_eeprom(hw);
Auke Kok8fc897b2006-08-28 14:56:16 -07004884 } while (retry_count < EEPROM_MAX_RETRY_SPI);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004885
4886 /* ATMEL SPI write time could vary from 0-20mSec on 3.3V devices (and
4887 * only 0-5mSec on 5V devices)
4888 */
Auke Kok8fc897b2006-08-28 14:56:16 -07004889 if (retry_count >= EEPROM_MAX_RETRY_SPI) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004890 DEBUGOUT("SPI EEPROM Status error\n");
4891 return -E1000_ERR_EEPROM;
4892 }
4893
4894 return E1000_SUCCESS;
4895}
4896
4897/******************************************************************************
4898 * Reads a 16 bit word from the EEPROM.
4899 *
4900 * hw - Struct containing variables accessed by shared code
4901 * offset - offset of word in the EEPROM to read
4902 * data - word read from the EEPROM
4903 * words - number of words to read
4904 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07004905s32 e1000_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004906{
4907 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches406874a2008-04-03 10:06:32 -07004908 u32 i = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004909
4910 DEBUGFUNC("e1000_read_eeprom");
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004911
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004912 /* If eeprom is not yet detected, do so now */
4913 if (eeprom->word_size == 0)
4914 e1000_init_eeprom_params(hw);
4915
Linus Torvalds1da177e2005-04-16 15:20:36 -07004916 /* A check for invalid values: offset too large, too many words, and not
4917 * enough words.
4918 */
Auke Kok8fc897b2006-08-28 14:56:16 -07004919 if ((offset >= eeprom->word_size) || (words > eeprom->word_size - offset) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07004920 (words == 0)) {
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004921 DEBUGOUT2("\"words\" parameter out of bounds. Words = %d, size = %d\n", offset, eeprom->word_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004922 return -E1000_ERR_EEPROM;
4923 }
4924
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004925 /* EEPROM's that don't use EERD to read require us to bit-bang the SPI
4926 * directly. In this case, we need to acquire the EEPROM so that
4927 * FW or other port software does not interrupt.
4928 */
Joe Perchesc3033b02008-03-21 11:06:25 -07004929 if (e1000_is_onboard_nvm_eeprom(hw) && !hw->eeprom.use_eerd) {
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004930 /* Prepare the EEPROM for bit-bang reading */
4931 if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
4932 return -E1000_ERR_EEPROM;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004933 }
4934
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004935 /* Eerd register EEPROM access requires no eeprom aquire/release */
Joe Perchesc3033b02008-03-21 11:06:25 -07004936 if (eeprom->use_eerd)
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004937 return e1000_read_eeprom_eerd(hw, offset, words, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004938
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004939 /* ICH EEPROM access is done via the ICH flash controller */
Auke Kokcd94dd02006-06-27 09:08:22 -07004940 if (eeprom->type == e1000_eeprom_ich8)
4941 return e1000_read_eeprom_ich8(hw, offset, words, data);
4942
Jeff Kirsher2a88c172006-09-27 12:54:05 -07004943 /* Set up the SPI or Microwire EEPROM for bit-bang reading. We have
4944 * acquired the EEPROM at this point, so any returns should relase it */
Auke Kokcd94dd02006-06-27 09:08:22 -07004945 if (eeprom->type == e1000_eeprom_spi) {
Joe Perches406874a2008-04-03 10:06:32 -07004946 u16 word_in;
4947 u8 read_opcode = EEPROM_READ_OPCODE_SPI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004948
Auke Kok8fc897b2006-08-28 14:56:16 -07004949 if (e1000_spi_eeprom_ready(hw)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004950 e1000_release_eeprom(hw);
4951 return -E1000_ERR_EEPROM;
4952 }
4953
4954 e1000_standby_eeprom(hw);
4955
4956 /* Some SPI eeproms use the 8th address bit embedded in the opcode */
Auke Kok8fc897b2006-08-28 14:56:16 -07004957 if ((eeprom->address_bits == 8) && (offset >= 128))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004958 read_opcode |= EEPROM_A8_OPCODE_SPI;
4959
4960 /* Send the READ command (opcode + addr) */
4961 e1000_shift_out_ee_bits(hw, read_opcode, eeprom->opcode_bits);
Joe Perches406874a2008-04-03 10:06:32 -07004962 e1000_shift_out_ee_bits(hw, (u16)(offset*2), eeprom->address_bits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004963
4964 /* Read the data. The address of the eeprom internally increments with
4965 * each byte (spi) being read, saving on the overhead of eeprom setup
4966 * and tear-down. The address counter will roll over if reading beyond
4967 * the size of the eeprom, thus allowing the entire memory to be read
4968 * starting from any offset. */
4969 for (i = 0; i < words; i++) {
4970 word_in = e1000_shift_in_ee_bits(hw, 16);
4971 data[i] = (word_in >> 8) | (word_in << 8);
4972 }
Auke Kok8fc897b2006-08-28 14:56:16 -07004973 } else if (eeprom->type == e1000_eeprom_microwire) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004974 for (i = 0; i < words; i++) {
4975 /* Send the READ command (opcode + addr) */
4976 e1000_shift_out_ee_bits(hw, EEPROM_READ_OPCODE_MICROWIRE,
4977 eeprom->opcode_bits);
Joe Perches406874a2008-04-03 10:06:32 -07004978 e1000_shift_out_ee_bits(hw, (u16)(offset + i),
Linus Torvalds1da177e2005-04-16 15:20:36 -07004979 eeprom->address_bits);
4980
4981 /* Read the data. For microwire, each word requires the overhead
4982 * of eeprom setup and tear-down. */
4983 data[i] = e1000_shift_in_ee_bits(hw, 16);
4984 e1000_standby_eeprom(hw);
4985 }
4986 }
4987
4988 /* End this read operation */
4989 e1000_release_eeprom(hw);
4990
4991 return E1000_SUCCESS;
4992}
4993
4994/******************************************************************************
Malli Chilakala2d7edb92005-04-28 19:43:52 -07004995 * Reads a 16 bit word from the EEPROM using the EERD register.
4996 *
4997 * hw - Struct containing variables accessed by shared code
4998 * offset - offset of word in the EEPROM to read
4999 * data - word read from the EEPROM
5000 * words - number of words to read
5001 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005002static s32 e1000_read_eeprom_eerd(struct e1000_hw *hw, u16 offset, u16 words,
5003 u16 *data)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005004{
Joe Perches406874a2008-04-03 10:06:32 -07005005 u32 i, eerd = 0;
5006 s32 error = 0;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005007
5008 for (i = 0; i < words; i++) {
5009 eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) +
5010 E1000_EEPROM_RW_REG_START;
5011
Joe Perches1dc32912008-07-11 15:17:08 -07005012 ew32(EERD, eerd);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005013 error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ);
Auke Kok76c224b2006-05-23 13:36:06 -07005014
Auke Kok8fc897b2006-08-28 14:56:16 -07005015 if (error) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005016 break;
5017 }
Joe Perches1dc32912008-07-11 15:17:08 -07005018 data[i] = (er32(EERD) >> E1000_EEPROM_RW_REG_DATA);
Auke Kok76c224b2006-05-23 13:36:06 -07005019
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005020 }
Auke Kok76c224b2006-05-23 13:36:06 -07005021
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005022 return error;
5023}
5024
5025/******************************************************************************
5026 * Writes a 16 bit word from the EEPROM using the EEWR register.
5027 *
5028 * hw - Struct containing variables accessed by shared code
5029 * offset - offset of word in the EEPROM to read
5030 * data - word read from the EEPROM
5031 * words - number of words to read
5032 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005033static s32 e1000_write_eeprom_eewr(struct e1000_hw *hw, u16 offset, u16 words,
5034 u16 *data)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005035{
Joe Perches406874a2008-04-03 10:06:32 -07005036 u32 register_value = 0;
5037 u32 i = 0;
5038 s32 error = 0;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005039
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08005040 if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM))
5041 return -E1000_ERR_SWFW_SYNC;
5042
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005043 for (i = 0; i < words; i++) {
Auke Kok76c224b2006-05-23 13:36:06 -07005044 register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) |
5045 ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) |
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005046 E1000_EEPROM_RW_REG_START;
5047
5048 error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
Auke Kok8fc897b2006-08-28 14:56:16 -07005049 if (error) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005050 break;
Auke Kok76c224b2006-05-23 13:36:06 -07005051 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005052
Joe Perches1dc32912008-07-11 15:17:08 -07005053 ew32(EEWR, register_value);
Auke Kok76c224b2006-05-23 13:36:06 -07005054
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005055 error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
Auke Kok76c224b2006-05-23 13:36:06 -07005056
Auke Kok8fc897b2006-08-28 14:56:16 -07005057 if (error) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005058 break;
Auke Kok76c224b2006-05-23 13:36:06 -07005059 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005060 }
Auke Kok76c224b2006-05-23 13:36:06 -07005061
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08005062 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005063 return error;
5064}
5065
5066/******************************************************************************
5067 * Polls the status bit (bit 1) of the EERD to determine when the read is done.
5068 *
5069 * hw - Struct containing variables accessed by shared code
5070 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005071static s32 e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005072{
Joe Perches406874a2008-04-03 10:06:32 -07005073 u32 attempts = 100000;
5074 u32 i, reg = 0;
5075 s32 done = E1000_ERR_EEPROM;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005076
Auke Kok8fc897b2006-08-28 14:56:16 -07005077 for (i = 0; i < attempts; i++) {
5078 if (eerd == E1000_EEPROM_POLL_READ)
Joe Perches1dc32912008-07-11 15:17:08 -07005079 reg = er32(EERD);
Auke Kok76c224b2006-05-23 13:36:06 -07005080 else
Joe Perches1dc32912008-07-11 15:17:08 -07005081 reg = er32(EEWR);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005082
Auke Kok8fc897b2006-08-28 14:56:16 -07005083 if (reg & E1000_EEPROM_RW_REG_DONE) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005084 done = E1000_SUCCESS;
5085 break;
5086 }
5087 udelay(5);
5088 }
5089
5090 return done;
5091}
5092
5093/***************************************************************************
5094* Description: Determines if the onboard NVM is FLASH or EEPROM.
5095*
5096* hw - Struct containing variables accessed by shared code
5097****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005098static bool e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005099{
Joe Perches406874a2008-04-03 10:06:32 -07005100 u32 eecd = 0;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005101
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08005102 DEBUGFUNC("e1000_is_onboard_nvm_eeprom");
5103
Auke Kokcd94dd02006-06-27 09:08:22 -07005104 if (hw->mac_type == e1000_ich8lan)
Joe Perchesc3033b02008-03-21 11:06:25 -07005105 return false;
Auke Kokcd94dd02006-06-27 09:08:22 -07005106
5107 if (hw->mac_type == e1000_82573) {
Joe Perches1dc32912008-07-11 15:17:08 -07005108 eecd = er32(EECD);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005109
5110 /* Isolate bits 15 & 16 */
5111 eecd = ((eecd >> 15) & 0x03);
5112
5113 /* If both bits are set, device is Flash type */
Auke Kok8fc897b2006-08-28 14:56:16 -07005114 if (eecd == 0x03) {
Joe Perchesc3033b02008-03-21 11:06:25 -07005115 return false;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005116 }
5117 }
Joe Perchesc3033b02008-03-21 11:06:25 -07005118 return true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005119}
5120
5121/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07005122 * Verifies that the EEPROM has a valid checksum
5123 *
5124 * hw - Struct containing variables accessed by shared code
5125 *
5126 * Reads the first 64 16 bit words of the EEPROM and sums the values read.
5127 * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
5128 * valid.
5129 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005130s32 e1000_validate_eeprom_checksum(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005131{
Joe Perches406874a2008-04-03 10:06:32 -07005132 u16 checksum = 0;
5133 u16 i, eeprom_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005134
5135 DEBUGFUNC("e1000_validate_eeprom_checksum");
5136
Joe Perchesc3033b02008-03-21 11:06:25 -07005137 if ((hw->mac_type == e1000_82573) && !e1000_is_onboard_nvm_eeprom(hw)) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005138 /* Check bit 4 of word 10h. If it is 0, firmware is done updating
5139 * 10h-12h. Checksum may need to be fixed. */
5140 e1000_read_eeprom(hw, 0x10, 1, &eeprom_data);
5141 if ((eeprom_data & 0x10) == 0) {
5142 /* Read 0x23 and check bit 15. This bit is a 1 when the checksum
5143 * has already been fixed. If the checksum is still wrong and this
5144 * bit is a 1, we need to return bad checksum. Otherwise, we need
5145 * to set this bit to a 1 and update the checksum. */
5146 e1000_read_eeprom(hw, 0x23, 1, &eeprom_data);
5147 if ((eeprom_data & 0x8000) == 0) {
5148 eeprom_data |= 0x8000;
5149 e1000_write_eeprom(hw, 0x23, 1, &eeprom_data);
5150 e1000_update_eeprom_checksum(hw);
5151 }
5152 }
5153 }
5154
Auke Kokcd94dd02006-06-27 09:08:22 -07005155 if (hw->mac_type == e1000_ich8lan) {
5156 /* Drivers must allocate the shadow ram structure for the
5157 * EEPROM checksum to be updated. Otherwise, this bit as well
5158 * as the checksum must both be set correctly for this
5159 * validation to pass.
5160 */
5161 e1000_read_eeprom(hw, 0x19, 1, &eeprom_data);
5162 if ((eeprom_data & 0x40) == 0) {
5163 eeprom_data |= 0x40;
5164 e1000_write_eeprom(hw, 0x19, 1, &eeprom_data);
5165 e1000_update_eeprom_checksum(hw);
5166 }
5167 }
5168
5169 for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
5170 if (e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005171 DEBUGOUT("EEPROM Read Error\n");
5172 return -E1000_ERR_EEPROM;
5173 }
5174 checksum += eeprom_data;
5175 }
5176
Joe Perchese982f172008-07-11 15:17:18 -07005177 if (checksum == (u16)EEPROM_SUM)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005178 return E1000_SUCCESS;
5179 else {
5180 DEBUGOUT("EEPROM Checksum Invalid\n");
5181 return -E1000_ERR_EEPROM;
5182 }
5183}
5184
5185/******************************************************************************
5186 * Calculates the EEPROM checksum and writes it to the EEPROM
5187 *
5188 * hw - Struct containing variables accessed by shared code
5189 *
5190 * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
5191 * Writes the difference to word offset 63 of the EEPROM.
5192 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005193s32 e1000_update_eeprom_checksum(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005194{
Joe Perches406874a2008-04-03 10:06:32 -07005195 u32 ctrl_ext;
5196 u16 checksum = 0;
5197 u16 i, eeprom_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005198
5199 DEBUGFUNC("e1000_update_eeprom_checksum");
5200
Auke Kok8fc897b2006-08-28 14:56:16 -07005201 for (i = 0; i < EEPROM_CHECKSUM_REG; i++) {
5202 if (e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005203 DEBUGOUT("EEPROM Read Error\n");
5204 return -E1000_ERR_EEPROM;
5205 }
5206 checksum += eeprom_data;
5207 }
Joe Perchese982f172008-07-11 15:17:18 -07005208 checksum = (u16)EEPROM_SUM - checksum;
Auke Kok8fc897b2006-08-28 14:56:16 -07005209 if (e1000_write_eeprom(hw, EEPROM_CHECKSUM_REG, 1, &checksum) < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005210 DEBUGOUT("EEPROM Write Error\n");
5211 return -E1000_ERR_EEPROM;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005212 } else if (hw->eeprom.type == e1000_eeprom_flash) {
5213 e1000_commit_shadow_ram(hw);
Auke Kokcd94dd02006-06-27 09:08:22 -07005214 } else if (hw->eeprom.type == e1000_eeprom_ich8) {
5215 e1000_commit_shadow_ram(hw);
5216 /* Reload the EEPROM, or else modifications will not appear
5217 * until after next adapter reset. */
Joe Perches1dc32912008-07-11 15:17:08 -07005218 ctrl_ext = er32(CTRL_EXT);
Auke Kokcd94dd02006-06-27 09:08:22 -07005219 ctrl_ext |= E1000_CTRL_EXT_EE_RST;
Joe Perches1dc32912008-07-11 15:17:08 -07005220 ew32(CTRL_EXT, ctrl_ext);
Jeff Garzikf8ec4732006-09-19 15:27:07 -04005221 msleep(10);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005222 }
5223 return E1000_SUCCESS;
5224}
5225
5226/******************************************************************************
5227 * Parent function for writing words to the different EEPROM types.
5228 *
5229 * hw - Struct containing variables accessed by shared code
5230 * offset - offset within the EEPROM to be written to
5231 * words - number of words to write
5232 * data - 16 bit word to be written to the EEPROM
5233 *
5234 * If e1000_update_eeprom_checksum is not called after this function, the
5235 * EEPROM will most likely contain an invalid checksum.
5236 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005237s32 e1000_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005238{
5239 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches406874a2008-04-03 10:06:32 -07005240 s32 status = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005241
5242 DEBUGFUNC("e1000_write_eeprom");
5243
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005244 /* If eeprom is not yet detected, do so now */
5245 if (eeprom->word_size == 0)
5246 e1000_init_eeprom_params(hw);
5247
Linus Torvalds1da177e2005-04-16 15:20:36 -07005248 /* A check for invalid values: offset too large, too many words, and not
5249 * enough words.
5250 */
Auke Kok8fc897b2006-08-28 14:56:16 -07005251 if ((offset >= eeprom->word_size) || (words > eeprom->word_size - offset) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07005252 (words == 0)) {
5253 DEBUGOUT("\"words\" parameter out of bounds\n");
5254 return -E1000_ERR_EEPROM;
5255 }
5256
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04005257 /* 82573 writes only through eewr */
Joe Perchesc3033b02008-03-21 11:06:25 -07005258 if (eeprom->use_eewr)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005259 return e1000_write_eeprom_eewr(hw, offset, words, data);
5260
Auke Kokcd94dd02006-06-27 09:08:22 -07005261 if (eeprom->type == e1000_eeprom_ich8)
5262 return e1000_write_eeprom_ich8(hw, offset, words, data);
5263
Linus Torvalds1da177e2005-04-16 15:20:36 -07005264 /* Prepare the EEPROM for writing */
5265 if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
5266 return -E1000_ERR_EEPROM;
5267
Auke Kok8fc897b2006-08-28 14:56:16 -07005268 if (eeprom->type == e1000_eeprom_microwire) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005269 status = e1000_write_eeprom_microwire(hw, offset, words, data);
5270 } else {
5271 status = e1000_write_eeprom_spi(hw, offset, words, data);
Jeff Garzikf8ec4732006-09-19 15:27:07 -04005272 msleep(10);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005273 }
5274
5275 /* Done with writing */
5276 e1000_release_eeprom(hw);
5277
5278 return status;
5279}
5280
5281/******************************************************************************
5282 * Writes a 16 bit word to a given offset in an SPI EEPROM.
5283 *
5284 * hw - Struct containing variables accessed by shared code
5285 * offset - offset within the EEPROM to be written to
5286 * words - number of words to write
5287 * data - pointer to array of 8 bit words to be written to the EEPROM
5288 *
5289 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005290static s32 e1000_write_eeprom_spi(struct e1000_hw *hw, u16 offset, u16 words,
5291 u16 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005292{
5293 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches406874a2008-04-03 10:06:32 -07005294 u16 widx = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005295
5296 DEBUGFUNC("e1000_write_eeprom_spi");
5297
5298 while (widx < words) {
Joe Perches406874a2008-04-03 10:06:32 -07005299 u8 write_opcode = EEPROM_WRITE_OPCODE_SPI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005300
Auke Kok8fc897b2006-08-28 14:56:16 -07005301 if (e1000_spi_eeprom_ready(hw)) return -E1000_ERR_EEPROM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005302
5303 e1000_standby_eeprom(hw);
5304
5305 /* Send the WRITE ENABLE command (8 bit opcode ) */
5306 e1000_shift_out_ee_bits(hw, EEPROM_WREN_OPCODE_SPI,
5307 eeprom->opcode_bits);
5308
5309 e1000_standby_eeprom(hw);
5310
5311 /* Some SPI eeproms use the 8th address bit embedded in the opcode */
Auke Kok8fc897b2006-08-28 14:56:16 -07005312 if ((eeprom->address_bits == 8) && (offset >= 128))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005313 write_opcode |= EEPROM_A8_OPCODE_SPI;
5314
5315 /* Send the Write command (8-bit opcode + addr) */
5316 e1000_shift_out_ee_bits(hw, write_opcode, eeprom->opcode_bits);
5317
Joe Perches406874a2008-04-03 10:06:32 -07005318 e1000_shift_out_ee_bits(hw, (u16)((offset + widx)*2),
Linus Torvalds1da177e2005-04-16 15:20:36 -07005319 eeprom->address_bits);
5320
5321 /* Send the data */
5322
5323 /* Loop to allow for up to whole page write (32 bytes) of eeprom */
5324 while (widx < words) {
Joe Perches406874a2008-04-03 10:06:32 -07005325 u16 word_out = data[widx];
Linus Torvalds1da177e2005-04-16 15:20:36 -07005326 word_out = (word_out >> 8) | (word_out << 8);
5327 e1000_shift_out_ee_bits(hw, word_out, 16);
5328 widx++;
5329
5330 /* Some larger eeprom sizes are capable of a 32-byte PAGE WRITE
5331 * operation, while the smaller eeproms are capable of an 8-byte
5332 * PAGE WRITE operation. Break the inner loop to pass new address
5333 */
Auke Kok8fc897b2006-08-28 14:56:16 -07005334 if ((((offset + widx)*2) % eeprom->page_size) == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005335 e1000_standby_eeprom(hw);
5336 break;
5337 }
5338 }
5339 }
5340
5341 return E1000_SUCCESS;
5342}
5343
5344/******************************************************************************
5345 * Writes a 16 bit word to a given offset in a Microwire EEPROM.
5346 *
5347 * hw - Struct containing variables accessed by shared code
5348 * offset - offset within the EEPROM to be written to
5349 * words - number of words to write
5350 * data - pointer to array of 16 bit words to be written to the EEPROM
5351 *
5352 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005353static s32 e1000_write_eeprom_microwire(struct e1000_hw *hw, u16 offset,
5354 u16 words, u16 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005355{
5356 struct e1000_eeprom_info *eeprom = &hw->eeprom;
Joe Perches406874a2008-04-03 10:06:32 -07005357 u32 eecd;
5358 u16 words_written = 0;
5359 u16 i = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005360
5361 DEBUGFUNC("e1000_write_eeprom_microwire");
5362
5363 /* Send the write enable command to the EEPROM (3-bit opcode plus
5364 * 6/8-bit dummy address beginning with 11). It's less work to include
5365 * the 11 of the dummy address as part of the opcode than it is to shift
5366 * it over the correct number of bits for the address. This puts the
5367 * EEPROM into write/erase mode.
5368 */
5369 e1000_shift_out_ee_bits(hw, EEPROM_EWEN_OPCODE_MICROWIRE,
Joe Perches406874a2008-04-03 10:06:32 -07005370 (u16)(eeprom->opcode_bits + 2));
Linus Torvalds1da177e2005-04-16 15:20:36 -07005371
Joe Perches406874a2008-04-03 10:06:32 -07005372 e1000_shift_out_ee_bits(hw, 0, (u16)(eeprom->address_bits - 2));
Linus Torvalds1da177e2005-04-16 15:20:36 -07005373
5374 /* Prepare the EEPROM */
5375 e1000_standby_eeprom(hw);
5376
5377 while (words_written < words) {
5378 /* Send the Write command (3-bit opcode + addr) */
5379 e1000_shift_out_ee_bits(hw, EEPROM_WRITE_OPCODE_MICROWIRE,
5380 eeprom->opcode_bits);
5381
Joe Perches406874a2008-04-03 10:06:32 -07005382 e1000_shift_out_ee_bits(hw, (u16)(offset + words_written),
Linus Torvalds1da177e2005-04-16 15:20:36 -07005383 eeprom->address_bits);
5384
5385 /* Send the data */
5386 e1000_shift_out_ee_bits(hw, data[words_written], 16);
5387
5388 /* Toggle the CS line. This in effect tells the EEPROM to execute
5389 * the previous command.
5390 */
5391 e1000_standby_eeprom(hw);
5392
5393 /* Read DO repeatedly until it is high (equal to '1'). The EEPROM will
5394 * signal that the command has been completed by raising the DO signal.
5395 * If DO does not go high in 10 milliseconds, then error out.
5396 */
Auke Kok8fc897b2006-08-28 14:56:16 -07005397 for (i = 0; i < 200; i++) {
Joe Perches1dc32912008-07-11 15:17:08 -07005398 eecd = er32(EECD);
Auke Kok8fc897b2006-08-28 14:56:16 -07005399 if (eecd & E1000_EECD_DO) break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005400 udelay(50);
5401 }
Auke Kok8fc897b2006-08-28 14:56:16 -07005402 if (i == 200) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005403 DEBUGOUT("EEPROM Write did not complete\n");
5404 return -E1000_ERR_EEPROM;
5405 }
5406
5407 /* Recover from write */
5408 e1000_standby_eeprom(hw);
5409
5410 words_written++;
5411 }
5412
5413 /* Send the write disable command to the EEPROM (3-bit opcode plus
5414 * 6/8-bit dummy address beginning with 10). It's less work to include
5415 * the 10 of the dummy address as part of the opcode than it is to shift
5416 * it over the correct number of bits for the address. This takes the
5417 * EEPROM out of write/erase mode.
5418 */
5419 e1000_shift_out_ee_bits(hw, EEPROM_EWDS_OPCODE_MICROWIRE,
Joe Perches406874a2008-04-03 10:06:32 -07005420 (u16)(eeprom->opcode_bits + 2));
Linus Torvalds1da177e2005-04-16 15:20:36 -07005421
Joe Perches406874a2008-04-03 10:06:32 -07005422 e1000_shift_out_ee_bits(hw, 0, (u16)(eeprom->address_bits - 2));
Linus Torvalds1da177e2005-04-16 15:20:36 -07005423
5424 return E1000_SUCCESS;
5425}
5426
5427/******************************************************************************
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005428 * Flushes the cached eeprom to NVM. This is done by saving the modified values
5429 * in the eeprom cache and the non modified values in the currently active bank
5430 * to the new bank.
5431 *
5432 * hw - Struct containing variables accessed by shared code
5433 * offset - offset of word in the EEPROM to read
5434 * data - word read from the EEPROM
5435 * words - number of words to read
5436 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005437static s32 e1000_commit_shadow_ram(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005438{
Joe Perches406874a2008-04-03 10:06:32 -07005439 u32 attempts = 100000;
5440 u32 eecd = 0;
5441 u32 flop = 0;
5442 u32 i = 0;
5443 s32 error = E1000_SUCCESS;
5444 u32 old_bank_offset = 0;
5445 u32 new_bank_offset = 0;
5446 u8 low_byte = 0;
5447 u8 high_byte = 0;
Joe Perchesc3033b02008-03-21 11:06:25 -07005448 bool sector_write_failed = false;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005449
5450 if (hw->mac_type == e1000_82573) {
Auke Kokcd94dd02006-06-27 09:08:22 -07005451 /* The flop register will be used to determine if flash type is STM */
Joe Perches1dc32912008-07-11 15:17:08 -07005452 flop = er32(FLOP);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005453 for (i=0; i < attempts; i++) {
Joe Perches1dc32912008-07-11 15:17:08 -07005454 eecd = er32(EECD);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005455 if ((eecd & E1000_EECD_FLUPD) == 0) {
5456 break;
5457 }
5458 udelay(5);
5459 }
5460
5461 if (i == attempts) {
5462 return -E1000_ERR_EEPROM;
5463 }
5464
Jesse Brandeburg96838a42006-01-18 13:01:39 -08005465 /* If STM opcode located in bits 15:8 of flop, reset firmware */
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005466 if ((flop & 0xFF00) == E1000_STM_OPCODE) {
Joe Perches1dc32912008-07-11 15:17:08 -07005467 ew32(HICR, E1000_HICR_FW_RESET);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005468 }
5469
5470 /* Perform the flash update */
Joe Perches1dc32912008-07-11 15:17:08 -07005471 ew32(EECD, eecd | E1000_EECD_FLUPD);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005472
Jesse Brandeburg96838a42006-01-18 13:01:39 -08005473 for (i=0; i < attempts; i++) {
Joe Perches1dc32912008-07-11 15:17:08 -07005474 eecd = er32(EECD);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005475 if ((eecd & E1000_EECD_FLUPD) == 0) {
5476 break;
5477 }
5478 udelay(5);
5479 }
5480
5481 if (i == attempts) {
5482 return -E1000_ERR_EEPROM;
5483 }
5484 }
5485
Auke Kokcd94dd02006-06-27 09:08:22 -07005486 if (hw->mac_type == e1000_ich8lan && hw->eeprom_shadow_ram != NULL) {
5487 /* We're writing to the opposite bank so if we're on bank 1,
5488 * write to bank 0 etc. We also need to erase the segment that
5489 * is going to be written */
Joe Perches1dc32912008-07-11 15:17:08 -07005490 if (!(er32(EECD) & E1000_EECD_SEC1VAL)) {
Auke Kokcd94dd02006-06-27 09:08:22 -07005491 new_bank_offset = hw->flash_bank_size * 2;
5492 old_bank_offset = 0;
5493 e1000_erase_ich8_4k_segment(hw, 1);
5494 } else {
5495 old_bank_offset = hw->flash_bank_size * 2;
5496 new_bank_offset = 0;
5497 e1000_erase_ich8_4k_segment(hw, 0);
5498 }
5499
Joe Perchesc3033b02008-03-21 11:06:25 -07005500 sector_write_failed = false;
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005501 /* Loop for every byte in the shadow RAM,
5502 * which is in units of words. */
5503 for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) {
5504 /* Determine whether to write the value stored
5505 * in the other NVM bank or a modified value stored
5506 * in the shadow RAM */
Joe Perchesc3033b02008-03-21 11:06:25 -07005507 if (hw->eeprom_shadow_ram[i].modified) {
Joe Perches406874a2008-04-03 10:06:32 -07005508 low_byte = (u8)hw->eeprom_shadow_ram[i].eeprom_word;
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005509 udelay(100);
5510 error = e1000_verify_write_ich8_byte(hw,
5511 (i << 1) + new_bank_offset, low_byte);
5512
5513 if (error != E1000_SUCCESS)
Joe Perchesc3033b02008-03-21 11:06:25 -07005514 sector_write_failed = true;
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005515 else {
Auke Kokcd94dd02006-06-27 09:08:22 -07005516 high_byte =
Joe Perches406874a2008-04-03 10:06:32 -07005517 (u8)(hw->eeprom_shadow_ram[i].eeprom_word >> 8);
Auke Kokcd94dd02006-06-27 09:08:22 -07005518 udelay(100);
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005519 }
5520 } else {
5521 e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset,
5522 &low_byte);
5523 udelay(100);
5524 error = e1000_verify_write_ich8_byte(hw,
5525 (i << 1) + new_bank_offset, low_byte);
5526
5527 if (error != E1000_SUCCESS)
Joe Perchesc3033b02008-03-21 11:06:25 -07005528 sector_write_failed = true;
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005529 else {
Auke Kokcd94dd02006-06-27 09:08:22 -07005530 e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset + 1,
5531 &high_byte);
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005532 udelay(100);
Auke Kokcd94dd02006-06-27 09:08:22 -07005533 }
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005534 }
Auke Kokcd94dd02006-06-27 09:08:22 -07005535
Joe Perchesc3033b02008-03-21 11:06:25 -07005536 /* If the write of the low byte was successful, go ahead and
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005537 * write the high byte while checking to make sure that if it
5538 * is the signature byte, then it is handled properly */
Joe Perchesc3033b02008-03-21 11:06:25 -07005539 if (!sector_write_failed) {
Auke Kokcd94dd02006-06-27 09:08:22 -07005540 /* If the word is 0x13, then make sure the signature bits
5541 * (15:14) are 11b until the commit has completed.
5542 * This will allow us to write 10b which indicates the
5543 * signature is valid. We want to do this after the write
5544 * has completed so that we don't mark the segment valid
5545 * while the write is still in progress */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08005546 if (i == E1000_ICH_NVM_SIG_WORD)
5547 high_byte = E1000_ICH_NVM_SIG_MASK | high_byte;
Auke Kokcd94dd02006-06-27 09:08:22 -07005548
5549 error = e1000_verify_write_ich8_byte(hw,
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005550 (i << 1) + new_bank_offset + 1, high_byte);
Auke Kokcd94dd02006-06-27 09:08:22 -07005551 if (error != E1000_SUCCESS)
Joe Perchesc3033b02008-03-21 11:06:25 -07005552 sector_write_failed = true;
Auke Kokcd94dd02006-06-27 09:08:22 -07005553
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005554 } else {
5555 /* If the write failed then break from the loop and
5556 * return an error */
5557 break;
5558 }
5559 }
5560
5561 /* Don't bother writing the segment valid bits if sector
5562 * programming failed. */
Joe Perchesc3033b02008-03-21 11:06:25 -07005563 if (!sector_write_failed) {
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005564 /* Finally validate the new segment by setting bit 15:14
5565 * to 10b in word 0x13 , this can be done without an
5566 * erase as well since these bits are 11 to start with
5567 * and we need to change bit 14 to 0b */
5568 e1000_read_ich8_byte(hw,
Jeff Kirsher2df7d592006-11-01 08:48:02 -08005569 E1000_ICH_NVM_SIG_WORD * 2 + 1 + new_bank_offset,
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005570 &high_byte);
5571 high_byte &= 0xBF;
5572 error = e1000_verify_write_ich8_byte(hw,
Jeff Kirsher2df7d592006-11-01 08:48:02 -08005573 E1000_ICH_NVM_SIG_WORD * 2 + 1 + new_bank_offset, high_byte);
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005574 /* And invalidate the previously valid segment by setting
5575 * its signature word (0x13) high_byte to 0b. This can be
5576 * done without an erase because flash erase sets all bits
5577 * to 1's. We can write 1's to 0's without an erase */
5578 if (error == E1000_SUCCESS) {
5579 error = e1000_verify_write_ich8_byte(hw,
Jeff Kirsher2df7d592006-11-01 08:48:02 -08005580 E1000_ICH_NVM_SIG_WORD * 2 + 1 + old_bank_offset, 0);
Auke Kokcd94dd02006-06-27 09:08:22 -07005581 }
5582
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005583 /* Clear the now not used entry in the cache */
5584 for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) {
Joe Perchesc3033b02008-03-21 11:06:25 -07005585 hw->eeprom_shadow_ram[i].modified = false;
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005586 hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF;
Auke Kokcd94dd02006-06-27 09:08:22 -07005587 }
Jeff Kirsher2a88c172006-09-27 12:54:05 -07005588 }
Auke Kokcd94dd02006-06-27 09:08:22 -07005589 }
5590
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005591 return error;
5592}
5593
5594/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07005595 * Reads the adapter's MAC address from the EEPROM and inverts the LSB for the
5596 * second function of dual function devices
5597 *
5598 * hw - Struct containing variables accessed by shared code
5599 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005600s32 e1000_read_mac_addr(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005601{
Joe Perches406874a2008-04-03 10:06:32 -07005602 u16 offset;
5603 u16 eeprom_data, i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005604
5605 DEBUGFUNC("e1000_read_mac_addr");
5606
Auke Kok8fc897b2006-08-28 14:56:16 -07005607 for (i = 0; i < NODE_ADDRESS_SIZE; i += 2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005608 offset = i >> 1;
Auke Kok8fc897b2006-08-28 14:56:16 -07005609 if (e1000_read_eeprom(hw, offset, 1, &eeprom_data) < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005610 DEBUGOUT("EEPROM Read Error\n");
5611 return -E1000_ERR_EEPROM;
5612 }
Joe Perchese982f172008-07-11 15:17:18 -07005613 hw->perm_mac_addr[i] = (u8)(eeprom_data & 0x00FF);
5614 hw->perm_mac_addr[i+1] = (u8)(eeprom_data >> 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005615 }
Jesse Brandeburg96838a42006-01-18 13:01:39 -08005616
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04005617 switch (hw->mac_type) {
5618 default:
5619 break;
5620 case e1000_82546:
5621 case e1000_82546_rev_3:
5622 case e1000_82571:
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08005623 case e1000_80003es2lan:
Joe Perches1dc32912008-07-11 15:17:08 -07005624 if (er32(STATUS) & E1000_STATUS_FUNC_1)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005625 hw->perm_mac_addr[5] ^= 0x01;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04005626 break;
5627 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005628
Auke Kok8fc897b2006-08-28 14:56:16 -07005629 for (i = 0; i < NODE_ADDRESS_SIZE; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005630 hw->mac_addr[i] = hw->perm_mac_addr[i];
5631 return E1000_SUCCESS;
5632}
5633
5634/******************************************************************************
5635 * Initializes receive address filters.
5636 *
5637 * hw - Struct containing variables accessed by shared code
5638 *
5639 * Places the MAC address in receive address register 0 and clears the rest
5640 * of the receive addresss registers. Clears the multicast table. Assumes
5641 * the receiver is in reset when the routine is called.
5642 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005643static void e1000_init_rx_addrs(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005644{
Joe Perches406874a2008-04-03 10:06:32 -07005645 u32 i;
5646 u32 rar_num;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005647
5648 DEBUGFUNC("e1000_init_rx_addrs");
5649
5650 /* Setup the receive address. */
5651 DEBUGOUT("Programming MAC Address into RAR[0]\n");
5652
5653 e1000_rar_set(hw, hw->mac_addr, 0);
5654
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005655 rar_num = E1000_RAR_ENTRIES;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04005656
5657 /* Reserve a spot for the Locally Administered Address to work around
5658 * an 82571 issue in which a reset on one port will reload the MAC on
5659 * the other port. */
Joe Perchesc3033b02008-03-21 11:06:25 -07005660 if ((hw->mac_type == e1000_82571) && (hw->laa_is_present))
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04005661 rar_num -= 1;
Auke Kokcd94dd02006-06-27 09:08:22 -07005662 if (hw->mac_type == e1000_ich8lan)
5663 rar_num = E1000_RAR_ENTRIES_ICH8LAN;
5664
Linus Torvalds1da177e2005-04-16 15:20:36 -07005665 /* Zero out the other 15 receive addresses. */
5666 DEBUGOUT("Clearing RAR[1-15]\n");
Auke Kok8fc897b2006-08-28 14:56:16 -07005667 for (i = 1; i < rar_num; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005668 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
Joe Perches1dc32912008-07-11 15:17:08 -07005669 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005670 E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
Joe Perches1dc32912008-07-11 15:17:08 -07005671 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005672 }
5673}
5674
5675/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07005676 * Hashes an address to determine its location in the multicast table
5677 *
5678 * hw - Struct containing variables accessed by shared code
5679 * mc_addr - the multicast address to hash
5680 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005681u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005682{
Joe Perches406874a2008-04-03 10:06:32 -07005683 u32 hash_value = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005684
5685 /* The portion of the address that is used for the hash table is
5686 * determined by the mc_filter_type setting.
5687 */
5688 switch (hw->mc_filter_type) {
5689 /* [0] [1] [2] [3] [4] [5]
5690 * 01 AA 00 12 34 56
5691 * LSB MSB
5692 */
5693 case 0:
Auke Kokcd94dd02006-06-27 09:08:22 -07005694 if (hw->mac_type == e1000_ich8lan) {
5695 /* [47:38] i.e. 0x158 for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005696 hash_value = ((mc_addr[4] >> 6) | (((u16)mc_addr[5]) << 2));
Auke Kokcd94dd02006-06-27 09:08:22 -07005697 } else {
5698 /* [47:36] i.e. 0x563 for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005699 hash_value = ((mc_addr[4] >> 4) | (((u16)mc_addr[5]) << 4));
Auke Kokcd94dd02006-06-27 09:08:22 -07005700 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005701 break;
5702 case 1:
Auke Kokcd94dd02006-06-27 09:08:22 -07005703 if (hw->mac_type == e1000_ich8lan) {
5704 /* [46:37] i.e. 0x2B1 for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005705 hash_value = ((mc_addr[4] >> 5) | (((u16)mc_addr[5]) << 3));
Auke Kokcd94dd02006-06-27 09:08:22 -07005706 } else {
5707 /* [46:35] i.e. 0xAC6 for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005708 hash_value = ((mc_addr[4] >> 3) | (((u16)mc_addr[5]) << 5));
Auke Kokcd94dd02006-06-27 09:08:22 -07005709 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005710 break;
5711 case 2:
Auke Kokcd94dd02006-06-27 09:08:22 -07005712 if (hw->mac_type == e1000_ich8lan) {
5713 /*[45:36] i.e. 0x163 for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005714 hash_value = ((mc_addr[4] >> 4) | (((u16)mc_addr[5]) << 4));
Auke Kokcd94dd02006-06-27 09:08:22 -07005715 } else {
5716 /* [45:34] i.e. 0x5D8 for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005717 hash_value = ((mc_addr[4] >> 2) | (((u16)mc_addr[5]) << 6));
Auke Kokcd94dd02006-06-27 09:08:22 -07005718 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005719 break;
5720 case 3:
Auke Kokcd94dd02006-06-27 09:08:22 -07005721 if (hw->mac_type == e1000_ich8lan) {
5722 /* [43:34] i.e. 0x18D for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005723 hash_value = ((mc_addr[4] >> 2) | (((u16)mc_addr[5]) << 6));
Auke Kokcd94dd02006-06-27 09:08:22 -07005724 } else {
5725 /* [43:32] i.e. 0x634 for above example address */
Joe Perchese982f172008-07-11 15:17:18 -07005726 hash_value = ((mc_addr[4]) | (((u16)mc_addr[5]) << 8));
Auke Kokcd94dd02006-06-27 09:08:22 -07005727 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005728 break;
5729 }
5730
5731 hash_value &= 0xFFF;
Auke Kokcd94dd02006-06-27 09:08:22 -07005732 if (hw->mac_type == e1000_ich8lan)
5733 hash_value &= 0x3FF;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005734
Linus Torvalds1da177e2005-04-16 15:20:36 -07005735 return hash_value;
5736}
5737
5738/******************************************************************************
5739 * Sets the bit in the multicast table corresponding to the hash value.
5740 *
5741 * hw - Struct containing variables accessed by shared code
5742 * hash_value - Multicast address hash value
5743 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005744void e1000_mta_set(struct e1000_hw *hw, u32 hash_value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005745{
Joe Perches406874a2008-04-03 10:06:32 -07005746 u32 hash_bit, hash_reg;
5747 u32 mta;
5748 u32 temp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005749
5750 /* The MTA is a register array of 128 32-bit registers.
5751 * It is treated like an array of 4096 bits. We want to set
5752 * bit BitArray[hash_value]. So we figure out what register
5753 * the bit is in, read it, OR in the new bit, then write
5754 * back the new value. The register is determined by the
5755 * upper 7 bits of the hash value and the bit within that
5756 * register are determined by the lower 5 bits of the value.
5757 */
5758 hash_reg = (hash_value >> 5) & 0x7F;
Auke Kokcd94dd02006-06-27 09:08:22 -07005759 if (hw->mac_type == e1000_ich8lan)
5760 hash_reg &= 0x1F;
Auke Kok90fb5132006-11-01 08:47:30 -08005761
Linus Torvalds1da177e2005-04-16 15:20:36 -07005762 hash_bit = hash_value & 0x1F;
5763
5764 mta = E1000_READ_REG_ARRAY(hw, MTA, hash_reg);
5765
5766 mta |= (1 << hash_bit);
5767
5768 /* If we are on an 82544 and we are trying to write an odd offset
5769 * in the MTA, save off the previous entry before writing and
5770 * restore the old value after writing.
5771 */
Auke Kok8fc897b2006-08-28 14:56:16 -07005772 if ((hw->mac_type == e1000_82544) && ((hash_reg & 0x1) == 1)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005773 temp = E1000_READ_REG_ARRAY(hw, MTA, (hash_reg - 1));
5774 E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta);
Joe Perches1dc32912008-07-11 15:17:08 -07005775 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005776 E1000_WRITE_REG_ARRAY(hw, MTA, (hash_reg - 1), temp);
Joe Perches1dc32912008-07-11 15:17:08 -07005777 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005778 } else {
5779 E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta);
Joe Perches1dc32912008-07-11 15:17:08 -07005780 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005781 }
5782}
5783
5784/******************************************************************************
5785 * Puts an ethernet address into a receive address register.
5786 *
5787 * hw - Struct containing variables accessed by shared code
5788 * addr - Address to put into receive address register
5789 * index - Receive address register to write
5790 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005791void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005792{
Joe Perches406874a2008-04-03 10:06:32 -07005793 u32 rar_low, rar_high;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005794
5795 /* HW expects these in little endian so we reverse the byte order
5796 * from network order (big endian) to little endian
5797 */
Joe Perchese982f172008-07-11 15:17:18 -07005798 rar_low = ((u32)addr[0] | ((u32)addr[1] << 8) |
5799 ((u32)addr[2] << 16) | ((u32)addr[3] << 24));
5800 rar_high = ((u32)addr[4] | ((u32)addr[5] << 8));
Linus Torvalds1da177e2005-04-16 15:20:36 -07005801
Jeff Kirsher8df06e52006-03-02 18:18:32 -08005802 /* Disable Rx and flush all Rx frames before enabling RSS to avoid Rx
5803 * unit hang.
5804 *
5805 * Description:
5806 * If there are any Rx frames queued up or otherwise present in the HW
5807 * before RSS is enabled, and then we enable RSS, the HW Rx unit will
5808 * hang. To work around this issue, we have to disable receives and
5809 * flush out all Rx frames before we enable RSS. To do so, we modify we
5810 * redirect all Rx traffic to manageability and then reset the HW.
5811 * This flushes away Rx frames, and (since the redirections to
5812 * manageability persists across resets) keeps new ones from coming in
5813 * while we work. Then, we clear the Address Valid AV bit for all MAC
5814 * addresses and undo the re-direction to manageability.
5815 * Now, frames are coming in again, but the MAC won't accept them, so
5816 * far so good. We now proceed to initialize RSS (if necessary) and
5817 * configure the Rx unit. Last, we re-enable the AV bits and continue
5818 * on our merry way.
5819 */
5820 switch (hw->mac_type) {
5821 case e1000_82571:
5822 case e1000_82572:
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08005823 case e1000_80003es2lan:
Joe Perchesc3033b02008-03-21 11:06:25 -07005824 if (hw->leave_av_bit_off)
Jeff Kirsher8df06e52006-03-02 18:18:32 -08005825 break;
5826 default:
5827 /* Indicate to hardware the Address is Valid. */
5828 rar_high |= E1000_RAH_AV;
5829 break;
5830 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005831
5832 E1000_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low);
Joe Perches1dc32912008-07-11 15:17:08 -07005833 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005834 E1000_WRITE_REG_ARRAY(hw, RA, ((index << 1) + 1), rar_high);
Joe Perches1dc32912008-07-11 15:17:08 -07005835 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005836}
5837
5838/******************************************************************************
5839 * Writes a value to the specified offset in the VLAN filter table.
5840 *
5841 * hw - Struct containing variables accessed by shared code
5842 * offset - Offset in VLAN filer table to write
5843 * value - Value to write into VLAN filter table
5844 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005845void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005846{
Joe Perches406874a2008-04-03 10:06:32 -07005847 u32 temp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005848
Auke Kokcd94dd02006-06-27 09:08:22 -07005849 if (hw->mac_type == e1000_ich8lan)
5850 return;
5851
5852 if ((hw->mac_type == e1000_82544) && ((offset & 0x1) == 1)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005853 temp = E1000_READ_REG_ARRAY(hw, VFTA, (offset - 1));
5854 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value);
Joe Perches1dc32912008-07-11 15:17:08 -07005855 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005856 E1000_WRITE_REG_ARRAY(hw, VFTA, (offset - 1), temp);
Joe Perches1dc32912008-07-11 15:17:08 -07005857 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005858 } else {
5859 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value);
Joe Perches1dc32912008-07-11 15:17:08 -07005860 E1000_WRITE_FLUSH();
Linus Torvalds1da177e2005-04-16 15:20:36 -07005861 }
5862}
5863
5864/******************************************************************************
5865 * Clears the VLAN filer table
5866 *
5867 * hw - Struct containing variables accessed by shared code
5868 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005869static void e1000_clear_vfta(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005870{
Joe Perches406874a2008-04-03 10:06:32 -07005871 u32 offset;
5872 u32 vfta_value = 0;
5873 u32 vfta_offset = 0;
5874 u32 vfta_bit_in_reg = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005875
Auke Kokcd94dd02006-06-27 09:08:22 -07005876 if (hw->mac_type == e1000_ich8lan)
5877 return;
5878
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005879 if (hw->mac_type == e1000_82573) {
5880 if (hw->mng_cookie.vlan_id != 0) {
5881 /* The VFTA is a 4096b bit-field, each identifying a single VLAN
5882 * ID. The following operations determine which 32b entry
5883 * (i.e. offset) into the array we want to set the VLAN ID
5884 * (i.e. bit) of the manageability unit. */
5885 vfta_offset = (hw->mng_cookie.vlan_id >>
5886 E1000_VFTA_ENTRY_SHIFT) &
5887 E1000_VFTA_ENTRY_MASK;
5888 vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id &
5889 E1000_VFTA_ENTRY_BIT_SHIFT_MASK);
5890 }
5891 }
5892 for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
5893 /* If the offset we want to clear is the same offset of the
5894 * manageability VLAN ID, then clear all bits except that of the
5895 * manageability unit */
5896 vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0;
5897 E1000_WRITE_REG_ARRAY(hw, VFTA, offset, vfta_value);
Joe Perches1dc32912008-07-11 15:17:08 -07005898 E1000_WRITE_FLUSH();
Malli Chilakala2d7edb92005-04-28 19:43:52 -07005899 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005900}
5901
Joe Perches64798842008-07-11 15:17:02 -07005902static s32 e1000_id_led_init(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005903{
Joe Perches406874a2008-04-03 10:06:32 -07005904 u32 ledctl;
5905 const u32 ledctl_mask = 0x000000FF;
5906 const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON;
5907 const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF;
5908 u16 eeprom_data, i, temp;
5909 const u16 led_mask = 0x0F;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005910
5911 DEBUGFUNC("e1000_id_led_init");
5912
Auke Kok8fc897b2006-08-28 14:56:16 -07005913 if (hw->mac_type < e1000_82540) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005914 /* Nothing to do */
5915 return E1000_SUCCESS;
5916 }
5917
Joe Perches1dc32912008-07-11 15:17:08 -07005918 ledctl = er32(LEDCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005919 hw->ledctl_default = ledctl;
5920 hw->ledctl_mode1 = hw->ledctl_default;
5921 hw->ledctl_mode2 = hw->ledctl_default;
5922
Auke Kok8fc897b2006-08-28 14:56:16 -07005923 if (e1000_read_eeprom(hw, EEPROM_ID_LED_SETTINGS, 1, &eeprom_data) < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005924 DEBUGOUT("EEPROM Read Error\n");
5925 return -E1000_ERR_EEPROM;
5926 }
Auke Kokcd94dd02006-06-27 09:08:22 -07005927
5928 if ((hw->mac_type == e1000_82573) &&
5929 (eeprom_data == ID_LED_RESERVED_82573))
5930 eeprom_data = ID_LED_DEFAULT_82573;
5931 else if ((eeprom_data == ID_LED_RESERVED_0000) ||
5932 (eeprom_data == ID_LED_RESERVED_FFFF)) {
5933 if (hw->mac_type == e1000_ich8lan)
5934 eeprom_data = ID_LED_DEFAULT_ICH8LAN;
5935 else
5936 eeprom_data = ID_LED_DEFAULT;
5937 }
Auke Kok90fb5132006-11-01 08:47:30 -08005938
Auke Kokcd94dd02006-06-27 09:08:22 -07005939 for (i = 0; i < 4; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005940 temp = (eeprom_data >> (i << 2)) & led_mask;
Auke Kok8fc897b2006-08-28 14:56:16 -07005941 switch (temp) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005942 case ID_LED_ON1_DEF2:
5943 case ID_LED_ON1_ON2:
5944 case ID_LED_ON1_OFF2:
5945 hw->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
5946 hw->ledctl_mode1 |= ledctl_on << (i << 3);
5947 break;
5948 case ID_LED_OFF1_DEF2:
5949 case ID_LED_OFF1_ON2:
5950 case ID_LED_OFF1_OFF2:
5951 hw->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
5952 hw->ledctl_mode1 |= ledctl_off << (i << 3);
5953 break;
5954 default:
5955 /* Do nothing */
5956 break;
5957 }
Auke Kok8fc897b2006-08-28 14:56:16 -07005958 switch (temp) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005959 case ID_LED_DEF1_ON2:
5960 case ID_LED_ON1_ON2:
5961 case ID_LED_OFF1_ON2:
5962 hw->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
5963 hw->ledctl_mode2 |= ledctl_on << (i << 3);
5964 break;
5965 case ID_LED_DEF1_OFF2:
5966 case ID_LED_ON1_OFF2:
5967 case ID_LED_OFF1_OFF2:
5968 hw->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
5969 hw->ledctl_mode2 |= ledctl_off << (i << 3);
5970 break;
5971 default:
5972 /* Do nothing */
5973 break;
5974 }
5975 }
5976 return E1000_SUCCESS;
5977}
5978
5979/******************************************************************************
5980 * Prepares SW controlable LED for use and saves the current state of the LED.
5981 *
5982 * hw - Struct containing variables accessed by shared code
5983 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07005984s32 e1000_setup_led(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005985{
Joe Perches406874a2008-04-03 10:06:32 -07005986 u32 ledctl;
5987 s32 ret_val = E1000_SUCCESS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005988
5989 DEBUGFUNC("e1000_setup_led");
5990
Auke Kok8fc897b2006-08-28 14:56:16 -07005991 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005992 case e1000_82542_rev2_0:
5993 case e1000_82542_rev2_1:
5994 case e1000_82543:
5995 case e1000_82544:
5996 /* No setup necessary */
5997 break;
5998 case e1000_82541:
5999 case e1000_82547:
6000 case e1000_82541_rev_2:
6001 case e1000_82547_rev_2:
6002 /* Turn off PHY Smart Power Down (if enabled) */
6003 ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO,
6004 &hw->phy_spd_default);
Auke Kok8fc897b2006-08-28 14:56:16 -07006005 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006006 return ret_val;
6007 ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
Joe Perches406874a2008-04-03 10:06:32 -07006008 (u16)(hw->phy_spd_default &
Linus Torvalds1da177e2005-04-16 15:20:36 -07006009 ~IGP01E1000_GMII_SPD));
Auke Kok8fc897b2006-08-28 14:56:16 -07006010 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006011 return ret_val;
6012 /* Fall Through */
6013 default:
Auke Kok8fc897b2006-08-28 14:56:16 -07006014 if (hw->media_type == e1000_media_type_fiber) {
Joe Perches1dc32912008-07-11 15:17:08 -07006015 ledctl = er32(LEDCTL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006016 /* Save current LEDCTL settings */
6017 hw->ledctl_default = ledctl;
6018 /* Turn off LED0 */
6019 ledctl &= ~(E1000_LEDCTL_LED0_IVRT |
6020 E1000_LEDCTL_LED0_BLINK |
6021 E1000_LEDCTL_LED0_MODE_MASK);
6022 ledctl |= (E1000_LEDCTL_MODE_LED_OFF <<
6023 E1000_LEDCTL_LED0_MODE_SHIFT);
Joe Perches1dc32912008-07-11 15:17:08 -07006024 ew32(LEDCTL, ledctl);
Auke Kok8fc897b2006-08-28 14:56:16 -07006025 } else if (hw->media_type == e1000_media_type_copper)
Joe Perches1dc32912008-07-11 15:17:08 -07006026 ew32(LEDCTL, hw->ledctl_mode1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006027 break;
6028 }
6029
6030 return E1000_SUCCESS;
6031}
6032
Auke Kok8fc897b2006-08-28 14:56:16 -07006033
Linus Torvalds1da177e2005-04-16 15:20:36 -07006034/******************************************************************************
Auke Kokf1b3a852006-06-27 09:07:56 -07006035 * Used on 82571 and later Si that has LED blink bits.
6036 * Callers must use their own timer and should have already called
6037 * e1000_id_led_init()
6038 * Call e1000_cleanup led() to stop blinking
6039 *
6040 * hw - Struct containing variables accessed by shared code
6041 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006042s32 e1000_blink_led_start(struct e1000_hw *hw)
Auke Kokf1b3a852006-06-27 09:07:56 -07006043{
Joe Perches406874a2008-04-03 10:06:32 -07006044 s16 i;
6045 u32 ledctl_blink = 0;
Auke Kokf1b3a852006-06-27 09:07:56 -07006046
6047 DEBUGFUNC("e1000_id_led_blink_on");
6048
6049 if (hw->mac_type < e1000_82571) {
6050 /* Nothing to do */
6051 return E1000_SUCCESS;
6052 }
6053 if (hw->media_type == e1000_media_type_fiber) {
6054 /* always blink LED0 for PCI-E fiber */
6055 ledctl_blink = E1000_LEDCTL_LED0_BLINK |
6056 (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
6057 } else {
6058 /* set the blink bit for each LED that's "on" (0x0E) in ledctl_mode2 */
6059 ledctl_blink = hw->ledctl_mode2;
6060 for (i=0; i < 4; i++)
6061 if (((hw->ledctl_mode2 >> (i * 8)) & 0xFF) ==
6062 E1000_LEDCTL_MODE_LED_ON)
6063 ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << (i * 8));
6064 }
6065
Joe Perches1dc32912008-07-11 15:17:08 -07006066 ew32(LEDCTL, ledctl_blink);
Auke Kokf1b3a852006-06-27 09:07:56 -07006067
6068 return E1000_SUCCESS;
6069}
6070
6071/******************************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07006072 * Restores the saved state of the SW controlable LED.
6073 *
6074 * hw - Struct containing variables accessed by shared code
6075 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006076s32 e1000_cleanup_led(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006077{
Joe Perches406874a2008-04-03 10:06:32 -07006078 s32 ret_val = E1000_SUCCESS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006079
6080 DEBUGFUNC("e1000_cleanup_led");
6081
Auke Kok8fc897b2006-08-28 14:56:16 -07006082 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006083 case e1000_82542_rev2_0:
6084 case e1000_82542_rev2_1:
6085 case e1000_82543:
6086 case e1000_82544:
6087 /* No cleanup necessary */
6088 break;
6089 case e1000_82541:
6090 case e1000_82547:
6091 case e1000_82541_rev_2:
6092 case e1000_82547_rev_2:
6093 /* Turn on PHY Smart Power Down (if previously enabled) */
6094 ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
6095 hw->phy_spd_default);
Auke Kok8fc897b2006-08-28 14:56:16 -07006096 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006097 return ret_val;
6098 /* Fall Through */
6099 default:
Auke Kokcd94dd02006-06-27 09:08:22 -07006100 if (hw->phy_type == e1000_phy_ife) {
6101 e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, 0);
6102 break;
6103 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006104 /* Restore LEDCTL settings */
Joe Perches1dc32912008-07-11 15:17:08 -07006105 ew32(LEDCTL, hw->ledctl_default);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006106 break;
6107 }
6108
6109 return E1000_SUCCESS;
6110}
6111
6112/******************************************************************************
6113 * Turns on the software controllable LED
6114 *
6115 * hw - Struct containing variables accessed by shared code
6116 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006117s32 e1000_led_on(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006118{
Joe Perches1dc32912008-07-11 15:17:08 -07006119 u32 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006120
6121 DEBUGFUNC("e1000_led_on");
6122
Auke Kok8fc897b2006-08-28 14:56:16 -07006123 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006124 case e1000_82542_rev2_0:
6125 case e1000_82542_rev2_1:
6126 case e1000_82543:
6127 /* Set SW Defineable Pin 0 to turn on the LED */
6128 ctrl |= E1000_CTRL_SWDPIN0;
6129 ctrl |= E1000_CTRL_SWDPIO0;
6130 break;
6131 case e1000_82544:
Auke Kok8fc897b2006-08-28 14:56:16 -07006132 if (hw->media_type == e1000_media_type_fiber) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006133 /* Set SW Defineable Pin 0 to turn on the LED */
6134 ctrl |= E1000_CTRL_SWDPIN0;
6135 ctrl |= E1000_CTRL_SWDPIO0;
6136 } else {
6137 /* Clear SW Defineable Pin 0 to turn on the LED */
6138 ctrl &= ~E1000_CTRL_SWDPIN0;
6139 ctrl |= E1000_CTRL_SWDPIO0;
6140 }
6141 break;
6142 default:
Auke Kok8fc897b2006-08-28 14:56:16 -07006143 if (hw->media_type == e1000_media_type_fiber) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006144 /* Clear SW Defineable Pin 0 to turn on the LED */
6145 ctrl &= ~E1000_CTRL_SWDPIN0;
6146 ctrl |= E1000_CTRL_SWDPIO0;
Auke Kokcd94dd02006-06-27 09:08:22 -07006147 } else if (hw->phy_type == e1000_phy_ife) {
6148 e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED,
6149 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON));
6150 } else if (hw->media_type == e1000_media_type_copper) {
Joe Perches1dc32912008-07-11 15:17:08 -07006151 ew32(LEDCTL, hw->ledctl_mode2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006152 return E1000_SUCCESS;
6153 }
6154 break;
6155 }
6156
Joe Perches1dc32912008-07-11 15:17:08 -07006157 ew32(CTRL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006158
6159 return E1000_SUCCESS;
6160}
6161
6162/******************************************************************************
6163 * Turns off the software controllable LED
6164 *
6165 * hw - Struct containing variables accessed by shared code
6166 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006167s32 e1000_led_off(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006168{
Joe Perches1dc32912008-07-11 15:17:08 -07006169 u32 ctrl = er32(CTRL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006170
6171 DEBUGFUNC("e1000_led_off");
6172
Auke Kok8fc897b2006-08-28 14:56:16 -07006173 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006174 case e1000_82542_rev2_0:
6175 case e1000_82542_rev2_1:
6176 case e1000_82543:
6177 /* Clear SW Defineable Pin 0 to turn off the LED */
6178 ctrl &= ~E1000_CTRL_SWDPIN0;
6179 ctrl |= E1000_CTRL_SWDPIO0;
6180 break;
6181 case e1000_82544:
Auke Kok8fc897b2006-08-28 14:56:16 -07006182 if (hw->media_type == e1000_media_type_fiber) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006183 /* Clear SW Defineable Pin 0 to turn off the LED */
6184 ctrl &= ~E1000_CTRL_SWDPIN0;
6185 ctrl |= E1000_CTRL_SWDPIO0;
6186 } else {
6187 /* Set SW Defineable Pin 0 to turn off the LED */
6188 ctrl |= E1000_CTRL_SWDPIN0;
6189 ctrl |= E1000_CTRL_SWDPIO0;
6190 }
6191 break;
6192 default:
Auke Kok8fc897b2006-08-28 14:56:16 -07006193 if (hw->media_type == e1000_media_type_fiber) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006194 /* Set SW Defineable Pin 0 to turn off the LED */
6195 ctrl |= E1000_CTRL_SWDPIN0;
6196 ctrl |= E1000_CTRL_SWDPIO0;
Auke Kokcd94dd02006-06-27 09:08:22 -07006197 } else if (hw->phy_type == e1000_phy_ife) {
6198 e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED,
6199 (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF));
6200 } else if (hw->media_type == e1000_media_type_copper) {
Joe Perches1dc32912008-07-11 15:17:08 -07006201 ew32(LEDCTL, hw->ledctl_mode1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006202 return E1000_SUCCESS;
6203 }
6204 break;
6205 }
6206
Joe Perches1dc32912008-07-11 15:17:08 -07006207 ew32(CTRL, ctrl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006208
6209 return E1000_SUCCESS;
6210}
6211
6212/******************************************************************************
6213 * Clears all hardware statistics counters.
6214 *
6215 * hw - Struct containing variables accessed by shared code
6216 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006217static void e1000_clear_hw_cntrs(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006218{
Joe Perches406874a2008-04-03 10:06:32 -07006219 volatile u32 temp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006220
Joe Perches1dc32912008-07-11 15:17:08 -07006221 temp = er32(CRCERRS);
6222 temp = er32(SYMERRS);
6223 temp = er32(MPC);
6224 temp = er32(SCC);
6225 temp = er32(ECOL);
6226 temp = er32(MCC);
6227 temp = er32(LATECOL);
6228 temp = er32(COLC);
6229 temp = er32(DC);
6230 temp = er32(SEC);
6231 temp = er32(RLEC);
6232 temp = er32(XONRXC);
6233 temp = er32(XONTXC);
6234 temp = er32(XOFFRXC);
6235 temp = er32(XOFFTXC);
6236 temp = er32(FCRUC);
Auke Kokcd94dd02006-06-27 09:08:22 -07006237
6238 if (hw->mac_type != e1000_ich8lan) {
Joe Perches1dc32912008-07-11 15:17:08 -07006239 temp = er32(PRC64);
6240 temp = er32(PRC127);
6241 temp = er32(PRC255);
6242 temp = er32(PRC511);
6243 temp = er32(PRC1023);
6244 temp = er32(PRC1522);
Auke Kokcd94dd02006-06-27 09:08:22 -07006245 }
6246
Joe Perches1dc32912008-07-11 15:17:08 -07006247 temp = er32(GPRC);
6248 temp = er32(BPRC);
6249 temp = er32(MPRC);
6250 temp = er32(GPTC);
6251 temp = er32(GORCL);
6252 temp = er32(GORCH);
6253 temp = er32(GOTCL);
6254 temp = er32(GOTCH);
6255 temp = er32(RNBC);
6256 temp = er32(RUC);
6257 temp = er32(RFC);
6258 temp = er32(ROC);
6259 temp = er32(RJC);
6260 temp = er32(TORL);
6261 temp = er32(TORH);
6262 temp = er32(TOTL);
6263 temp = er32(TOTH);
6264 temp = er32(TPR);
6265 temp = er32(TPT);
Auke Kokcd94dd02006-06-27 09:08:22 -07006266
6267 if (hw->mac_type != e1000_ich8lan) {
Joe Perches1dc32912008-07-11 15:17:08 -07006268 temp = er32(PTC64);
6269 temp = er32(PTC127);
6270 temp = er32(PTC255);
6271 temp = er32(PTC511);
6272 temp = er32(PTC1023);
6273 temp = er32(PTC1522);
Auke Kokcd94dd02006-06-27 09:08:22 -07006274 }
6275
Joe Perches1dc32912008-07-11 15:17:08 -07006276 temp = er32(MPTC);
6277 temp = er32(BPTC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006278
Auke Kok8fc897b2006-08-28 14:56:16 -07006279 if (hw->mac_type < e1000_82543) return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006280
Joe Perches1dc32912008-07-11 15:17:08 -07006281 temp = er32(ALGNERRC);
6282 temp = er32(RXERRC);
6283 temp = er32(TNCRS);
6284 temp = er32(CEXTERR);
6285 temp = er32(TSCTC);
6286 temp = er32(TSCTFC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006287
Auke Kok8fc897b2006-08-28 14:56:16 -07006288 if (hw->mac_type <= e1000_82544) return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006289
Joe Perches1dc32912008-07-11 15:17:08 -07006290 temp = er32(MGTPRC);
6291 temp = er32(MGTPDC);
6292 temp = er32(MGTPTC);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006293
Auke Kok8fc897b2006-08-28 14:56:16 -07006294 if (hw->mac_type <= e1000_82547_rev_2) return;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006295
Joe Perches1dc32912008-07-11 15:17:08 -07006296 temp = er32(IAC);
6297 temp = er32(ICRXOC);
Auke Kokcd94dd02006-06-27 09:08:22 -07006298
6299 if (hw->mac_type == e1000_ich8lan) return;
6300
Joe Perches1dc32912008-07-11 15:17:08 -07006301 temp = er32(ICRXPTC);
6302 temp = er32(ICRXATC);
6303 temp = er32(ICTXPTC);
6304 temp = er32(ICTXATC);
6305 temp = er32(ICTXQEC);
6306 temp = er32(ICTXQMTC);
6307 temp = er32(ICRXDMTC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006308}
6309
6310/******************************************************************************
6311 * Resets Adaptive IFS to its default state.
6312 *
6313 * hw - Struct containing variables accessed by shared code
6314 *
6315 * Call this after e1000_init_hw. You may override the IFS defaults by setting
Joe Perchesc3033b02008-03-21 11:06:25 -07006316 * hw->ifs_params_forced to true. However, you must initialize hw->
Linus Torvalds1da177e2005-04-16 15:20:36 -07006317 * current_ifs_val, ifs_min_val, ifs_max_val, ifs_step_size, and ifs_ratio
6318 * before calling this function.
6319 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006320void e1000_reset_adaptive(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006321{
6322 DEBUGFUNC("e1000_reset_adaptive");
6323
Auke Kok8fc897b2006-08-28 14:56:16 -07006324 if (hw->adaptive_ifs) {
6325 if (!hw->ifs_params_forced) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006326 hw->current_ifs_val = 0;
6327 hw->ifs_min_val = IFS_MIN;
6328 hw->ifs_max_val = IFS_MAX;
6329 hw->ifs_step_size = IFS_STEP;
6330 hw->ifs_ratio = IFS_RATIO;
6331 }
Joe Perchesc3033b02008-03-21 11:06:25 -07006332 hw->in_ifs_mode = false;
Joe Perches1dc32912008-07-11 15:17:08 -07006333 ew32(AIT, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006334 } else {
6335 DEBUGOUT("Not in Adaptive IFS mode!\n");
6336 }
6337}
6338
6339/******************************************************************************
6340 * Called during the callback/watchdog routine to update IFS value based on
6341 * the ratio of transmits to collisions.
6342 *
6343 * hw - Struct containing variables accessed by shared code
6344 * tx_packets - Number of transmits since last callback
6345 * total_collisions - Number of collisions since last callback
6346 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006347void e1000_update_adaptive(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006348{
6349 DEBUGFUNC("e1000_update_adaptive");
6350
Auke Kok8fc897b2006-08-28 14:56:16 -07006351 if (hw->adaptive_ifs) {
6352 if ((hw->collision_delta * hw->ifs_ratio) > hw->tx_packet_delta) {
6353 if (hw->tx_packet_delta > MIN_NUM_XMITS) {
Joe Perchesc3033b02008-03-21 11:06:25 -07006354 hw->in_ifs_mode = true;
Auke Kok8fc897b2006-08-28 14:56:16 -07006355 if (hw->current_ifs_val < hw->ifs_max_val) {
6356 if (hw->current_ifs_val == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006357 hw->current_ifs_val = hw->ifs_min_val;
6358 else
6359 hw->current_ifs_val += hw->ifs_step_size;
Joe Perches1dc32912008-07-11 15:17:08 -07006360 ew32(AIT, hw->current_ifs_val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006361 }
6362 }
6363 } else {
Auke Kok8fc897b2006-08-28 14:56:16 -07006364 if (hw->in_ifs_mode && (hw->tx_packet_delta <= MIN_NUM_XMITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006365 hw->current_ifs_val = 0;
Joe Perchesc3033b02008-03-21 11:06:25 -07006366 hw->in_ifs_mode = false;
Joe Perches1dc32912008-07-11 15:17:08 -07006367 ew32(AIT, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006368 }
6369 }
6370 } else {
6371 DEBUGOUT("Not in Adaptive IFS mode!\n");
6372 }
6373}
6374
6375/******************************************************************************
6376 * Adjusts the statistic counters when a frame is accepted by TBI_ACCEPT
6377 *
6378 * hw - Struct containing variables accessed by shared code
6379 * frame_len - The length of the frame in question
6380 * mac_addr - The Ethernet destination address of the frame in question
6381 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006382void e1000_tbi_adjust_stats(struct e1000_hw *hw, struct e1000_hw_stats *stats,
6383 u32 frame_len, u8 *mac_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006384{
Joe Perches406874a2008-04-03 10:06:32 -07006385 u64 carry_bit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006386
6387 /* First adjust the frame length. */
6388 frame_len--;
6389 /* We need to adjust the statistics counters, since the hardware
6390 * counters overcount this packet as a CRC error and undercount
6391 * the packet as a good packet
6392 */
6393 /* This packet should not be counted as a CRC error. */
6394 stats->crcerrs--;
6395 /* This packet does count as a Good Packet Received. */
6396 stats->gprc++;
6397
6398 /* Adjust the Good Octets received counters */
6399 carry_bit = 0x80000000 & stats->gorcl;
6400 stats->gorcl += frame_len;
6401 /* If the high bit of Gorcl (the low 32 bits of the Good Octets
6402 * Received Count) was one before the addition,
6403 * AND it is zero after, then we lost the carry out,
6404 * need to add one to Gorch (Good Octets Received Count High).
6405 * This could be simplified if all environments supported
6406 * 64-bit integers.
6407 */
Auke Kok8fc897b2006-08-28 14:56:16 -07006408 if (carry_bit && ((stats->gorcl & 0x80000000) == 0))
Linus Torvalds1da177e2005-04-16 15:20:36 -07006409 stats->gorch++;
6410 /* Is this a broadcast or multicast? Check broadcast first,
6411 * since the test for a multicast frame will test positive on
6412 * a broadcast frame.
6413 */
Joe Perchese982f172008-07-11 15:17:18 -07006414 if ((mac_addr[0] == (u8)0xff) && (mac_addr[1] == (u8)0xff))
Linus Torvalds1da177e2005-04-16 15:20:36 -07006415 /* Broadcast packet */
6416 stats->bprc++;
Auke Kok8fc897b2006-08-28 14:56:16 -07006417 else if (*mac_addr & 0x01)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006418 /* Multicast packet */
6419 stats->mprc++;
6420
Auke Kok8fc897b2006-08-28 14:56:16 -07006421 if (frame_len == hw->max_frame_size) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006422 /* In this case, the hardware has overcounted the number of
6423 * oversize frames.
6424 */
Auke Kok8fc897b2006-08-28 14:56:16 -07006425 if (stats->roc > 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006426 stats->roc--;
6427 }
6428
6429 /* Adjust the bin counters when the extra byte put the frame in the
6430 * wrong bin. Remember that the frame_len was adjusted above.
6431 */
Auke Kok8fc897b2006-08-28 14:56:16 -07006432 if (frame_len == 64) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006433 stats->prc64++;
6434 stats->prc127--;
Auke Kok8fc897b2006-08-28 14:56:16 -07006435 } else if (frame_len == 127) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006436 stats->prc127++;
6437 stats->prc255--;
Auke Kok8fc897b2006-08-28 14:56:16 -07006438 } else if (frame_len == 255) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006439 stats->prc255++;
6440 stats->prc511--;
Auke Kok8fc897b2006-08-28 14:56:16 -07006441 } else if (frame_len == 511) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006442 stats->prc511++;
6443 stats->prc1023--;
Auke Kok8fc897b2006-08-28 14:56:16 -07006444 } else if (frame_len == 1023) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006445 stats->prc1023++;
6446 stats->prc1522--;
Auke Kok8fc897b2006-08-28 14:56:16 -07006447 } else if (frame_len == 1522) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006448 stats->prc1522++;
6449 }
6450}
6451
6452/******************************************************************************
6453 * Gets the current PCI bus type, speed, and width of the hardware
6454 *
6455 * hw - Struct containing variables accessed by shared code
6456 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006457void e1000_get_bus_info(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006458{
Joe Perches406874a2008-04-03 10:06:32 -07006459 s32 ret_val;
6460 u16 pci_ex_link_status;
6461 u32 status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006462
6463 switch (hw->mac_type) {
6464 case e1000_82542_rev2_0:
6465 case e1000_82542_rev2_1:
Jeff Kirsherc3813ae2006-12-15 10:37:32 +01006466 hw->bus_type = e1000_bus_type_pci;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006467 hw->bus_speed = e1000_bus_speed_unknown;
6468 hw->bus_width = e1000_bus_width_unknown;
6469 break;
Jeff Kirshercaeccb62006-09-27 12:53:57 -07006470 case e1000_82571:
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04006471 case e1000_82572:
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006472 case e1000_82573:
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08006473 case e1000_80003es2lan:
Jeff Kirsherfd803242005-12-13 00:06:22 -05006474 hw->bus_type = e1000_bus_type_pci_express;
6475 hw->bus_speed = e1000_bus_speed_2500;
Jeff Kirshercaeccb62006-09-27 12:53:57 -07006476 ret_val = e1000_read_pcie_cap_reg(hw,
6477 PCI_EX_LINK_STATUS,
6478 &pci_ex_link_status);
6479 if (ret_val)
6480 hw->bus_width = e1000_bus_width_unknown;
6481 else
6482 hw->bus_width = (pci_ex_link_status & PCI_EX_LINK_WIDTH_MASK) >>
6483 PCI_EX_LINK_WIDTH_SHIFT;
6484 break;
6485 case e1000_ich8lan:
6486 hw->bus_type = e1000_bus_type_pci_express;
6487 hw->bus_speed = e1000_bus_speed_2500;
6488 hw->bus_width = e1000_bus_width_pciex_1;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006489 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006490 default:
Joe Perches1dc32912008-07-11 15:17:08 -07006491 status = er32(STATUS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006492 hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?
6493 e1000_bus_type_pcix : e1000_bus_type_pci;
6494
Auke Kok8fc897b2006-08-28 14:56:16 -07006495 if (hw->device_id == E1000_DEV_ID_82546EB_QUAD_COPPER) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006496 hw->bus_speed = (hw->bus_type == e1000_bus_type_pci) ?
6497 e1000_bus_speed_66 : e1000_bus_speed_120;
Auke Kok8fc897b2006-08-28 14:56:16 -07006498 } else if (hw->bus_type == e1000_bus_type_pci) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006499 hw->bus_speed = (status & E1000_STATUS_PCI66) ?
6500 e1000_bus_speed_66 : e1000_bus_speed_33;
6501 } else {
6502 switch (status & E1000_STATUS_PCIX_SPEED) {
6503 case E1000_STATUS_PCIX_SPEED_66:
6504 hw->bus_speed = e1000_bus_speed_66;
6505 break;
6506 case E1000_STATUS_PCIX_SPEED_100:
6507 hw->bus_speed = e1000_bus_speed_100;
6508 break;
6509 case E1000_STATUS_PCIX_SPEED_133:
6510 hw->bus_speed = e1000_bus_speed_133;
6511 break;
6512 default:
6513 hw->bus_speed = e1000_bus_speed_reserved;
6514 break;
6515 }
6516 }
6517 hw->bus_width = (status & E1000_STATUS_BUS64) ?
6518 e1000_bus_width_64 : e1000_bus_width_32;
6519 break;
6520 }
6521}
Linus Torvalds1da177e2005-04-16 15:20:36 -07006522
6523/******************************************************************************
6524 * Writes a value to one of the devices registers using port I/O (as opposed to
6525 * memory mapped I/O). Only 82544 and newer devices support port I/O.
6526 *
6527 * hw - Struct containing variables accessed by shared code
6528 * offset - offset to write to
6529 * value - value to write
6530 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006531static void e1000_write_reg_io(struct e1000_hw *hw, u32 offset, u32 value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006532{
6533 unsigned long io_addr = hw->io_base;
6534 unsigned long io_data = hw->io_base + 4;
6535
6536 e1000_io_write(hw, io_addr, offset);
6537 e1000_io_write(hw, io_data, value);
6538}
6539
Linus Torvalds1da177e2005-04-16 15:20:36 -07006540/******************************************************************************
6541 * Estimates the cable length.
6542 *
6543 * hw - Struct containing variables accessed by shared code
6544 * min_length - The estimated minimum length
6545 * max_length - The estimated maximum length
6546 *
6547 * returns: - E1000_ERR_XXX
6548 * E1000_SUCCESS
6549 *
6550 * This function always returns a ranged length (minimum & maximum).
6551 * So for M88 phy's, this function interprets the one value returned from the
6552 * register to the minimum and maximum range.
6553 * For IGP phy's, the function calculates the range by the AGC registers.
6554 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006555static s32 e1000_get_cable_length(struct e1000_hw *hw, u16 *min_length,
6556 u16 *max_length)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006557{
Joe Perches406874a2008-04-03 10:06:32 -07006558 s32 ret_val;
6559 u16 agc_value = 0;
6560 u16 i, phy_data;
6561 u16 cable_length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006562
6563 DEBUGFUNC("e1000_get_cable_length");
6564
6565 *min_length = *max_length = 0;
6566
6567 /* Use old method for Phy older than IGP */
Auke Kok8fc897b2006-08-28 14:56:16 -07006568 if (hw->phy_type == e1000_phy_m88) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006569
Linus Torvalds1da177e2005-04-16 15:20:36 -07006570 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
6571 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006572 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006573 return ret_val;
6574 cable_length = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
6575 M88E1000_PSSR_CABLE_LENGTH_SHIFT;
6576
6577 /* Convert the enum value to ranged values */
6578 switch (cable_length) {
6579 case e1000_cable_length_50:
6580 *min_length = 0;
6581 *max_length = e1000_igp_cable_length_50;
6582 break;
6583 case e1000_cable_length_50_80:
6584 *min_length = e1000_igp_cable_length_50;
6585 *max_length = e1000_igp_cable_length_80;
6586 break;
6587 case e1000_cable_length_80_110:
6588 *min_length = e1000_igp_cable_length_80;
6589 *max_length = e1000_igp_cable_length_110;
6590 break;
6591 case e1000_cable_length_110_140:
6592 *min_length = e1000_igp_cable_length_110;
6593 *max_length = e1000_igp_cable_length_140;
6594 break;
6595 case e1000_cable_length_140:
6596 *min_length = e1000_igp_cable_length_140;
6597 *max_length = e1000_igp_cable_length_170;
6598 break;
6599 default:
6600 return -E1000_ERR_PHY;
6601 break;
6602 }
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08006603 } else if (hw->phy_type == e1000_phy_gg82563) {
6604 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE,
6605 &phy_data);
6606 if (ret_val)
6607 return ret_val;
6608 cable_length = phy_data & GG82563_DSPD_CABLE_LENGTH;
6609
6610 switch (cable_length) {
6611 case e1000_gg_cable_length_60:
6612 *min_length = 0;
6613 *max_length = e1000_igp_cable_length_60;
6614 break;
6615 case e1000_gg_cable_length_60_115:
6616 *min_length = e1000_igp_cable_length_60;
6617 *max_length = e1000_igp_cable_length_115;
6618 break;
6619 case e1000_gg_cable_length_115_150:
6620 *min_length = e1000_igp_cable_length_115;
6621 *max_length = e1000_igp_cable_length_150;
6622 break;
6623 case e1000_gg_cable_length_150:
6624 *min_length = e1000_igp_cable_length_150;
6625 *max_length = e1000_igp_cable_length_180;
6626 break;
6627 default:
6628 return -E1000_ERR_PHY;
6629 break;
6630 }
Auke Kok8fc897b2006-08-28 14:56:16 -07006631 } else if (hw->phy_type == e1000_phy_igp) { /* For IGP PHY */
Joe Perches406874a2008-04-03 10:06:32 -07006632 u16 cur_agc_value;
6633 u16 min_agc_value = IGP01E1000_AGC_LENGTH_TABLE_SIZE;
6634 u16 agc_reg_array[IGP01E1000_PHY_CHANNEL_NUM] =
Linus Torvalds1da177e2005-04-16 15:20:36 -07006635 {IGP01E1000_PHY_AGC_A,
6636 IGP01E1000_PHY_AGC_B,
6637 IGP01E1000_PHY_AGC_C,
6638 IGP01E1000_PHY_AGC_D};
6639 /* Read the AGC registers for all channels */
Auke Kok8fc897b2006-08-28 14:56:16 -07006640 for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006641
6642 ret_val = e1000_read_phy_reg(hw, agc_reg_array[i], &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006643 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006644 return ret_val;
6645
Auke Kokcd94dd02006-06-27 09:08:22 -07006646 cur_agc_value = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006647
Auke Kokcd94dd02006-06-27 09:08:22 -07006648 /* Value bound check. */
6649 if ((cur_agc_value >= IGP01E1000_AGC_LENGTH_TABLE_SIZE - 1) ||
6650 (cur_agc_value == 0))
Linus Torvalds1da177e2005-04-16 15:20:36 -07006651 return -E1000_ERR_PHY;
6652
Auke Kokcd94dd02006-06-27 09:08:22 -07006653 agc_value += cur_agc_value;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006654
6655 /* Update minimal AGC value. */
Auke Kokcd94dd02006-06-27 09:08:22 -07006656 if (min_agc_value > cur_agc_value)
6657 min_agc_value = cur_agc_value;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006658 }
6659
6660 /* Remove the minimal AGC result for length < 50m */
Auke Kokcd94dd02006-06-27 09:08:22 -07006661 if (agc_value < IGP01E1000_PHY_CHANNEL_NUM * e1000_igp_cable_length_50) {
6662 agc_value -= min_agc_value;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006663
6664 /* Get the average length of the remaining 3 channels */
6665 agc_value /= (IGP01E1000_PHY_CHANNEL_NUM - 1);
6666 } else {
6667 /* Get the average length of all the 4 channels. */
6668 agc_value /= IGP01E1000_PHY_CHANNEL_NUM;
6669 }
6670
6671 /* Set the range of the calculated length. */
6672 *min_length = ((e1000_igp_cable_length_table[agc_value] -
6673 IGP01E1000_AGC_RANGE) > 0) ?
6674 (e1000_igp_cable_length_table[agc_value] -
6675 IGP01E1000_AGC_RANGE) : 0;
6676 *max_length = e1000_igp_cable_length_table[agc_value] +
6677 IGP01E1000_AGC_RANGE;
Auke Kokcd94dd02006-06-27 09:08:22 -07006678 } else if (hw->phy_type == e1000_phy_igp_2 ||
6679 hw->phy_type == e1000_phy_igp_3) {
Joe Perches406874a2008-04-03 10:06:32 -07006680 u16 cur_agc_index, max_agc_index = 0;
6681 u16 min_agc_index = IGP02E1000_AGC_LENGTH_TABLE_SIZE - 1;
6682 u16 agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] =
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04006683 {IGP02E1000_PHY_AGC_A,
6684 IGP02E1000_PHY_AGC_B,
6685 IGP02E1000_PHY_AGC_C,
6686 IGP02E1000_PHY_AGC_D};
6687 /* Read the AGC registers for all channels */
6688 for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) {
6689 ret_val = e1000_read_phy_reg(hw, agc_reg_array[i], &phy_data);
6690 if (ret_val)
6691 return ret_val;
6692
Auke Kok8fc897b2006-08-28 14:56:16 -07006693 /* Getting bits 15:9, which represent the combination of course and
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04006694 * fine gain values. The result is a number that can be put into
6695 * the lookup table to obtain the approximate cable length. */
Auke Kokcd94dd02006-06-27 09:08:22 -07006696 cur_agc_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) &
6697 IGP02E1000_AGC_LENGTH_MASK;
6698
6699 /* Array index bound check. */
6700 if ((cur_agc_index >= IGP02E1000_AGC_LENGTH_TABLE_SIZE) ||
6701 (cur_agc_index == 0))
6702 return -E1000_ERR_PHY;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04006703
6704 /* Remove min & max AGC values from calculation. */
Auke Kokcd94dd02006-06-27 09:08:22 -07006705 if (e1000_igp_2_cable_length_table[min_agc_index] >
6706 e1000_igp_2_cable_length_table[cur_agc_index])
6707 min_agc_index = cur_agc_index;
6708 if (e1000_igp_2_cable_length_table[max_agc_index] <
6709 e1000_igp_2_cable_length_table[cur_agc_index])
6710 max_agc_index = cur_agc_index;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04006711
Auke Kokcd94dd02006-06-27 09:08:22 -07006712 agc_value += e1000_igp_2_cable_length_table[cur_agc_index];
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04006713 }
6714
Auke Kokcd94dd02006-06-27 09:08:22 -07006715 agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] +
6716 e1000_igp_2_cable_length_table[max_agc_index]);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04006717 agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2);
6718
6719 /* Calculate cable length with the error range of +/- 10 meters. */
6720 *min_length = ((agc_value - IGP02E1000_AGC_RANGE) > 0) ?
6721 (agc_value - IGP02E1000_AGC_RANGE) : 0;
6722 *max_length = agc_value + IGP02E1000_AGC_RANGE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006723 }
6724
6725 return E1000_SUCCESS;
6726}
6727
6728/******************************************************************************
6729 * Check the cable polarity
6730 *
6731 * hw - Struct containing variables accessed by shared code
6732 * polarity - output parameter : 0 - Polarity is not reversed
6733 * 1 - Polarity is reversed.
6734 *
6735 * returns: - E1000_ERR_XXX
6736 * E1000_SUCCESS
6737 *
6738 * For phy's older then IGP, this function simply reads the polarity bit in the
6739 * Phy Status register. For IGP phy's, this bit is valid only if link speed is
6740 * 10 Mbps. If the link speed is 100 Mbps there is no polarity so this bit will
6741 * return 0. If the link speed is 1000 Mbps the polarity status is in the
6742 * IGP01E1000_PHY_PCS_INIT_REG.
6743 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006744static s32 e1000_check_polarity(struct e1000_hw *hw,
6745 e1000_rev_polarity *polarity)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006746{
Joe Perches406874a2008-04-03 10:06:32 -07006747 s32 ret_val;
6748 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006749
6750 DEBUGFUNC("e1000_check_polarity");
6751
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08006752 if ((hw->phy_type == e1000_phy_m88) ||
6753 (hw->phy_type == e1000_phy_gg82563)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006754 /* return the Polarity bit in the Status register. */
6755 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
6756 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006757 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006758 return ret_val;
Jeff Kirsher70c6f302006-09-27 12:53:31 -07006759 *polarity = ((phy_data & M88E1000_PSSR_REV_POLARITY) >>
6760 M88E1000_PSSR_REV_POLARITY_SHIFT) ?
6761 e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
6762
Auke Kokcd94dd02006-06-27 09:08:22 -07006763 } else if (hw->phy_type == e1000_phy_igp ||
6764 hw->phy_type == e1000_phy_igp_3 ||
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006765 hw->phy_type == e1000_phy_igp_2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006766 /* Read the Status register to check the speed */
6767 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
6768 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006769 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006770 return ret_val;
6771
6772 /* If speed is 1000 Mbps, must read the IGP01E1000_PHY_PCS_INIT_REG to
6773 * find the polarity status */
Auke Kok8fc897b2006-08-28 14:56:16 -07006774 if ((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==
Linus Torvalds1da177e2005-04-16 15:20:36 -07006775 IGP01E1000_PSSR_SPEED_1000MBPS) {
6776
6777 /* Read the GIG initialization PCS register (0x00B4) */
6778 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PCS_INIT_REG,
6779 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006780 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006781 return ret_val;
6782
6783 /* Check the polarity bits */
Jeff Kirsher70c6f302006-09-27 12:53:31 -07006784 *polarity = (phy_data & IGP01E1000_PHY_POLARITY_MASK) ?
6785 e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006786 } else {
6787 /* For 10 Mbps, read the polarity bit in the status register. (for
6788 * 100 Mbps this bit is always 0) */
Jeff Kirsher70c6f302006-09-27 12:53:31 -07006789 *polarity = (phy_data & IGP01E1000_PSSR_POLARITY_REVERSED) ?
6790 e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006791 }
Auke Kokcd94dd02006-06-27 09:08:22 -07006792 } else if (hw->phy_type == e1000_phy_ife) {
6793 ret_val = e1000_read_phy_reg(hw, IFE_PHY_EXTENDED_STATUS_CONTROL,
6794 &phy_data);
6795 if (ret_val)
6796 return ret_val;
Jeff Kirsher70c6f302006-09-27 12:53:31 -07006797 *polarity = ((phy_data & IFE_PESC_POLARITY_REVERSED) >>
6798 IFE_PESC_POLARITY_REVERSED_SHIFT) ?
6799 e1000_rev_polarity_reversed : e1000_rev_polarity_normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006800 }
6801 return E1000_SUCCESS;
6802}
6803
6804/******************************************************************************
6805 * Check if Downshift occured
6806 *
6807 * hw - Struct containing variables accessed by shared code
6808 * downshift - output parameter : 0 - No Downshift ocured.
6809 * 1 - Downshift ocured.
6810 *
6811 * returns: - E1000_ERR_XXX
Auke Kok76c224b2006-05-23 13:36:06 -07006812 * E1000_SUCCESS
Linus Torvalds1da177e2005-04-16 15:20:36 -07006813 *
6814 * For phy's older then IGP, this function reads the Downshift bit in the Phy
6815 * Specific Status register. For IGP phy's, it reads the Downgrade bit in the
6816 * Link Health register. In IGP this bit is latched high, so the driver must
6817 * read it immediately after link is established.
6818 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07006819static s32 e1000_check_downshift(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006820{
Joe Perches406874a2008-04-03 10:06:32 -07006821 s32 ret_val;
6822 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006823
6824 DEBUGFUNC("e1000_check_downshift");
6825
Auke Kokcd94dd02006-06-27 09:08:22 -07006826 if (hw->phy_type == e1000_phy_igp ||
6827 hw->phy_type == e1000_phy_igp_3 ||
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006828 hw->phy_type == e1000_phy_igp_2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006829 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,
6830 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006831 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006832 return ret_val;
6833
6834 hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08006835 } else if ((hw->phy_type == e1000_phy_m88) ||
6836 (hw->phy_type == e1000_phy_gg82563)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006837 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
6838 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006839 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006840 return ret_val;
6841
6842 hw->speed_downgraded = (phy_data & M88E1000_PSSR_DOWNSHIFT) >>
6843 M88E1000_PSSR_DOWNSHIFT_SHIFT;
Auke Kokcd94dd02006-06-27 09:08:22 -07006844 } else if (hw->phy_type == e1000_phy_ife) {
6845 /* e1000_phy_ife supports 10/100 speed only */
Joe Perchesc3033b02008-03-21 11:06:25 -07006846 hw->speed_downgraded = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006847 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07006848
Linus Torvalds1da177e2005-04-16 15:20:36 -07006849 return E1000_SUCCESS;
6850}
6851
6852/*****************************************************************************
6853 *
6854 * 82541_rev_2 & 82547_rev_2 have the capability to configure the DSP when a
6855 * gigabit link is achieved to improve link quality.
6856 *
6857 * hw: Struct containing variables accessed by shared code
6858 *
6859 * returns: - E1000_ERR_PHY if fail to read/write the PHY
6860 * E1000_SUCCESS at any other case.
6861 *
6862 ****************************************************************************/
6863
Joe Perches64798842008-07-11 15:17:02 -07006864static s32 e1000_config_dsp_after_link_change(struct e1000_hw *hw, bool link_up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006865{
Joe Perches406874a2008-04-03 10:06:32 -07006866 s32 ret_val;
6867 u16 phy_data, phy_saved_data, speed, duplex, i;
6868 u16 dsp_reg_array[IGP01E1000_PHY_CHANNEL_NUM] =
Linus Torvalds1da177e2005-04-16 15:20:36 -07006869 {IGP01E1000_PHY_AGC_PARAM_A,
6870 IGP01E1000_PHY_AGC_PARAM_B,
6871 IGP01E1000_PHY_AGC_PARAM_C,
6872 IGP01E1000_PHY_AGC_PARAM_D};
Joe Perches406874a2008-04-03 10:06:32 -07006873 u16 min_length, max_length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006874
6875 DEBUGFUNC("e1000_config_dsp_after_link_change");
6876
Auke Kok8fc897b2006-08-28 14:56:16 -07006877 if (hw->phy_type != e1000_phy_igp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006878 return E1000_SUCCESS;
6879
Auke Kok8fc897b2006-08-28 14:56:16 -07006880 if (link_up) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006881 ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
Auke Kok8fc897b2006-08-28 14:56:16 -07006882 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006883 DEBUGOUT("Error getting link speed and duplex\n");
6884 return ret_val;
6885 }
6886
Auke Kok8fc897b2006-08-28 14:56:16 -07006887 if (speed == SPEED_1000) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006888
Auke Kokcd94dd02006-06-27 09:08:22 -07006889 ret_val = e1000_get_cable_length(hw, &min_length, &max_length);
6890 if (ret_val)
6891 return ret_val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006892
Auke Kok8fc897b2006-08-28 14:56:16 -07006893 if ((hw->dsp_config_state == e1000_dsp_config_enabled) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07006894 min_length >= e1000_igp_cable_length_50) {
6895
Auke Kok8fc897b2006-08-28 14:56:16 -07006896 for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006897 ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i],
6898 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006899 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006900 return ret_val;
6901
6902 phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX;
6903
6904 ret_val = e1000_write_phy_reg(hw, dsp_reg_array[i],
6905 phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006906 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006907 return ret_val;
6908 }
6909 hw->dsp_config_state = e1000_dsp_config_activated;
6910 }
6911
Auke Kok8fc897b2006-08-28 14:56:16 -07006912 if ((hw->ffe_config_state == e1000_ffe_config_enabled) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07006913 (min_length < e1000_igp_cable_length_50)) {
6914
Joe Perches406874a2008-04-03 10:06:32 -07006915 u16 ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_20;
6916 u32 idle_errs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006917
6918 /* clear previous idle error counts */
6919 ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
6920 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006921 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006922 return ret_val;
6923
Auke Kok8fc897b2006-08-28 14:56:16 -07006924 for (i = 0; i < ffe_idle_err_timeout; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006925 udelay(1000);
6926 ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
6927 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006928 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006929 return ret_val;
6930
6931 idle_errs += (phy_data & SR_1000T_IDLE_ERROR_CNT);
Auke Kok8fc897b2006-08-28 14:56:16 -07006932 if (idle_errs > SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006933 hw->ffe_config_state = e1000_ffe_config_active;
6934
6935 ret_val = e1000_write_phy_reg(hw,
6936 IGP01E1000_PHY_DSP_FFE,
6937 IGP01E1000_PHY_DSP_FFE_CM_CP);
Auke Kok8fc897b2006-08-28 14:56:16 -07006938 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006939 return ret_val;
6940 break;
6941 }
6942
Auke Kok8fc897b2006-08-28 14:56:16 -07006943 if (idle_errs)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006944 ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_100;
6945 }
6946 }
6947 }
6948 } else {
Auke Kok8fc897b2006-08-28 14:56:16 -07006949 if (hw->dsp_config_state == e1000_dsp_config_activated) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006950 /* Save off the current value of register 0x2F5B to be restored at
6951 * the end of the routines. */
6952 ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
6953
Auke Kok8fc897b2006-08-28 14:56:16 -07006954 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006955 return ret_val;
6956
6957 /* Disable the PHY transmitter */
6958 ret_val = e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
6959
Auke Kok8fc897b2006-08-28 14:56:16 -07006960 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006961 return ret_val;
6962
Jeff Garzikf8ec4732006-09-19 15:27:07 -04006963 mdelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006964
6965 ret_val = e1000_write_phy_reg(hw, 0x0000,
6966 IGP01E1000_IEEE_FORCE_GIGA);
Auke Kok8fc897b2006-08-28 14:56:16 -07006967 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006968 return ret_val;
Auke Kok8fc897b2006-08-28 14:56:16 -07006969 for (i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006970 ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i], &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006971 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006972 return ret_val;
6973
6974 phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX;
6975 phy_data |= IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS;
6976
6977 ret_val = e1000_write_phy_reg(hw,dsp_reg_array[i], phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07006978 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006979 return ret_val;
6980 }
6981
6982 ret_val = e1000_write_phy_reg(hw, 0x0000,
6983 IGP01E1000_IEEE_RESTART_AUTONEG);
Auke Kok8fc897b2006-08-28 14:56:16 -07006984 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006985 return ret_val;
6986
Jeff Garzikf8ec4732006-09-19 15:27:07 -04006987 mdelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006988
6989 /* Now enable the transmitter */
6990 ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
6991
Auke Kok8fc897b2006-08-28 14:56:16 -07006992 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006993 return ret_val;
6994
6995 hw->dsp_config_state = e1000_dsp_config_enabled;
6996 }
6997
Auke Kok8fc897b2006-08-28 14:56:16 -07006998 if (hw->ffe_config_state == e1000_ffe_config_active) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006999 /* Save off the current value of register 0x2F5B to be restored at
7000 * the end of the routines. */
7001 ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
7002
Auke Kok8fc897b2006-08-28 14:56:16 -07007003 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007004 return ret_val;
7005
7006 /* Disable the PHY transmitter */
7007 ret_val = e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
7008
Auke Kok8fc897b2006-08-28 14:56:16 -07007009 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007010 return ret_val;
7011
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007012 mdelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007013
7014 ret_val = e1000_write_phy_reg(hw, 0x0000,
7015 IGP01E1000_IEEE_FORCE_GIGA);
Auke Kok8fc897b2006-08-28 14:56:16 -07007016 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007017 return ret_val;
7018 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_DSP_FFE,
7019 IGP01E1000_PHY_DSP_FFE_DEFAULT);
Auke Kok8fc897b2006-08-28 14:56:16 -07007020 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007021 return ret_val;
7022
7023 ret_val = e1000_write_phy_reg(hw, 0x0000,
7024 IGP01E1000_IEEE_RESTART_AUTONEG);
Auke Kok8fc897b2006-08-28 14:56:16 -07007025 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007026 return ret_val;
7027
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007028 mdelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007029
7030 /* Now enable the transmitter */
7031 ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
7032
Auke Kok8fc897b2006-08-28 14:56:16 -07007033 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007034 return ret_val;
7035
7036 hw->ffe_config_state = e1000_ffe_config_enabled;
7037 }
7038 }
7039 return E1000_SUCCESS;
7040}
7041
7042/*****************************************************************************
7043 * Set PHY to class A mode
7044 * Assumes the following operations will follow to enable the new class mode.
7045 * 1. Do a PHY soft reset
7046 * 2. Restart auto-negotiation or force link.
7047 *
7048 * hw - Struct containing variables accessed by shared code
7049 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007050static s32 e1000_set_phy_mode(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007051{
Joe Perches406874a2008-04-03 10:06:32 -07007052 s32 ret_val;
7053 u16 eeprom_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007054
7055 DEBUGFUNC("e1000_set_phy_mode");
7056
Auke Kok8fc897b2006-08-28 14:56:16 -07007057 if ((hw->mac_type == e1000_82545_rev_3) &&
7058 (hw->media_type == e1000_media_type_copper)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007059 ret_val = e1000_read_eeprom(hw, EEPROM_PHY_CLASS_WORD, 1, &eeprom_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007060 if (ret_val) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007061 return ret_val;
7062 }
7063
Auke Kok8fc897b2006-08-28 14:56:16 -07007064 if ((eeprom_data != EEPROM_RESERVED_WORD) &&
7065 (eeprom_data & EEPROM_PHY_CLASS_A)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007066 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x000B);
Auke Kok8fc897b2006-08-28 14:56:16 -07007067 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007068 return ret_val;
7069 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0x8104);
Auke Kok8fc897b2006-08-28 14:56:16 -07007070 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007071 return ret_val;
7072
Joe Perchesc3033b02008-03-21 11:06:25 -07007073 hw->phy_reset_disable = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007074 }
7075 }
7076
7077 return E1000_SUCCESS;
7078}
7079
7080/*****************************************************************************
7081 *
7082 * This function sets the lplu state according to the active flag. When
7083 * activating lplu this function also disables smart speed and vise versa.
7084 * lplu will not be activated unless the device autonegotiation advertisment
7085 * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes.
7086 * hw: Struct containing variables accessed by shared code
7087 * active - true to enable lplu false to disable lplu.
7088 *
7089 * returns: - E1000_ERR_PHY if fail to read/write the PHY
7090 * E1000_SUCCESS at any other case.
7091 *
7092 ****************************************************************************/
7093
Joe Perches64798842008-07-11 15:17:02 -07007094static s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007095{
Joe Perches406874a2008-04-03 10:06:32 -07007096 u32 phy_ctrl = 0;
7097 s32 ret_val;
7098 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007099 DEBUGFUNC("e1000_set_d3_lplu_state");
7100
Auke Kokcd94dd02006-06-27 09:08:22 -07007101 if (hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2
7102 && hw->phy_type != e1000_phy_igp_3)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007103 return E1000_SUCCESS;
7104
7105 /* During driver activity LPLU should not be used or it will attain link
7106 * from the lowest speeds starting from 10Mbps. The capability is used for
7107 * Dx transitions and states */
Auke Kokcd94dd02006-06-27 09:08:22 -07007108 if (hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007109 ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data);
Auke Kokcd94dd02006-06-27 09:08:22 -07007110 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007111 return ret_val;
Auke Kokcd94dd02006-06-27 09:08:22 -07007112 } else if (hw->mac_type == e1000_ich8lan) {
7113 /* MAC writes into PHY register based on the state transition
7114 * and start auto-negotiation. SW driver can overwrite the settings
7115 * in CSR PHY power control E1000_PHY_CTRL register. */
Joe Perches1dc32912008-07-11 15:17:08 -07007116 phy_ctrl = er32(PHY_CTRL);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007117 } else {
7118 ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007119 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007120 return ret_val;
7121 }
7122
Auke Kok8fc897b2006-08-28 14:56:16 -07007123 if (!active) {
7124 if (hw->mac_type == e1000_82541_rev_2 ||
7125 hw->mac_type == e1000_82547_rev_2) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007126 phy_data &= ~IGP01E1000_GMII_FLEX_SPD;
7127 ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007128 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007129 return ret_val;
7130 } else {
Auke Kokcd94dd02006-06-27 09:08:22 -07007131 if (hw->mac_type == e1000_ich8lan) {
7132 phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU;
Joe Perches1dc32912008-07-11 15:17:08 -07007133 ew32(PHY_CTRL, phy_ctrl);
Auke Kokcd94dd02006-06-27 09:08:22 -07007134 } else {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007135 phy_data &= ~IGP02E1000_PM_D3_LPLU;
7136 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
7137 phy_data);
7138 if (ret_val)
7139 return ret_val;
Auke Kokcd94dd02006-06-27 09:08:22 -07007140 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007141 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007142
7143 /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during
7144 * Dx states where the power conservation is most important. During
7145 * driver activity we should enable SmartSpeed, so performance is
7146 * maintained. */
7147 if (hw->smart_speed == e1000_smart_speed_on) {
7148 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7149 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007150 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007151 return ret_val;
7152
7153 phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
7154 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7155 phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007156 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007157 return ret_val;
7158 } else if (hw->smart_speed == e1000_smart_speed_off) {
7159 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7160 &phy_data);
Nicholas Nunley35574762006-09-27 12:53:34 -07007161 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007162 return ret_val;
7163
7164 phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
7165 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7166 phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007167 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007168 return ret_val;
7169 }
7170
Auke Kok8fc897b2006-08-28 14:56:16 -07007171 } else if ((hw->autoneg_advertised == AUTONEG_ADVERTISE_SPEED_DEFAULT) ||
7172 (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL ) ||
7173 (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007174
Auke Kok8fc897b2006-08-28 14:56:16 -07007175 if (hw->mac_type == e1000_82541_rev_2 ||
Auke Kokcd94dd02006-06-27 09:08:22 -07007176 hw->mac_type == e1000_82547_rev_2) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007177 phy_data |= IGP01E1000_GMII_FLEX_SPD;
7178 ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007179 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007180 return ret_val;
7181 } else {
Auke Kokcd94dd02006-06-27 09:08:22 -07007182 if (hw->mac_type == e1000_ich8lan) {
7183 phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU;
Joe Perches1dc32912008-07-11 15:17:08 -07007184 ew32(PHY_CTRL, phy_ctrl);
Auke Kokcd94dd02006-06-27 09:08:22 -07007185 } else {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007186 phy_data |= IGP02E1000_PM_D3_LPLU;
7187 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
7188 phy_data);
7189 if (ret_val)
7190 return ret_val;
Auke Kokcd94dd02006-06-27 09:08:22 -07007191 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007192 }
7193
7194 /* When LPLU is enabled we should disable SmartSpeed */
7195 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007196 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007197 return ret_val;
7198
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007199 phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
7200 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007201 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007202 return ret_val;
7203
7204 }
7205 return E1000_SUCCESS;
7206}
7207
7208/*****************************************************************************
7209 *
7210 * This function sets the lplu d0 state according to the active flag. When
7211 * activating lplu this function also disables smart speed and vise versa.
7212 * lplu will not be activated unless the device autonegotiation advertisment
7213 * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes.
7214 * hw: Struct containing variables accessed by shared code
7215 * active - true to enable lplu false to disable lplu.
7216 *
7217 * returns: - E1000_ERR_PHY if fail to read/write the PHY
7218 * E1000_SUCCESS at any other case.
7219 *
7220 ****************************************************************************/
7221
Joe Perches64798842008-07-11 15:17:02 -07007222static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007223{
Joe Perches406874a2008-04-03 10:06:32 -07007224 u32 phy_ctrl = 0;
7225 s32 ret_val;
7226 u16 phy_data;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007227 DEBUGFUNC("e1000_set_d0_lplu_state");
7228
Auke Kok8fc897b2006-08-28 14:56:16 -07007229 if (hw->mac_type <= e1000_82547_rev_2)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007230 return E1000_SUCCESS;
7231
Auke Kokcd94dd02006-06-27 09:08:22 -07007232 if (hw->mac_type == e1000_ich8lan) {
Joe Perches1dc32912008-07-11 15:17:08 -07007233 phy_ctrl = er32(PHY_CTRL);
Auke Kokcd94dd02006-06-27 09:08:22 -07007234 } else {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007235 ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007236 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007237 return ret_val;
Auke Kokcd94dd02006-06-27 09:08:22 -07007238 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007239
7240 if (!active) {
Auke Kokcd94dd02006-06-27 09:08:22 -07007241 if (hw->mac_type == e1000_ich8lan) {
7242 phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU;
Joe Perches1dc32912008-07-11 15:17:08 -07007243 ew32(PHY_CTRL, phy_ctrl);
Auke Kokcd94dd02006-06-27 09:08:22 -07007244 } else {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007245 phy_data &= ~IGP02E1000_PM_D0_LPLU;
7246 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
7247 if (ret_val)
7248 return ret_val;
Auke Kokcd94dd02006-06-27 09:08:22 -07007249 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007250
7251 /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during
7252 * Dx states where the power conservation is most important. During
7253 * driver activity we should enable SmartSpeed, so performance is
7254 * maintained. */
7255 if (hw->smart_speed == e1000_smart_speed_on) {
7256 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7257 &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007258 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007259 return ret_val;
7260
7261 phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
7262 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7263 phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007264 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007265 return ret_val;
7266 } else if (hw->smart_speed == e1000_smart_speed_off) {
7267 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7268 &phy_data);
Nicholas Nunley35574762006-09-27 12:53:34 -07007269 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007270 return ret_val;
7271
7272 phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
7273 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
7274 phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007275 if (ret_val)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007276 return ret_val;
7277 }
7278
7279
7280 } else {
Auke Kok76c224b2006-05-23 13:36:06 -07007281
Auke Kokcd94dd02006-06-27 09:08:22 -07007282 if (hw->mac_type == e1000_ich8lan) {
7283 phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU;
Joe Perches1dc32912008-07-11 15:17:08 -07007284 ew32(PHY_CTRL, phy_ctrl);
Auke Kokcd94dd02006-06-27 09:08:22 -07007285 } else {
Auke Kok76c224b2006-05-23 13:36:06 -07007286 phy_data |= IGP02E1000_PM_D0_LPLU;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007287 ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
7288 if (ret_val)
7289 return ret_val;
Auke Kokcd94dd02006-06-27 09:08:22 -07007290 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007291
Linus Torvalds1da177e2005-04-16 15:20:36 -07007292 /* When LPLU is enabled we should disable SmartSpeed */
7293 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007294 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007295 return ret_val;
7296
7297 phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
7298 ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007299 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007300 return ret_val;
7301
7302 }
7303 return E1000_SUCCESS;
7304}
7305
7306/******************************************************************************
7307 * Change VCO speed register to improve Bit Error Rate performance of SERDES.
7308 *
7309 * hw - Struct containing variables accessed by shared code
7310 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007311static s32 e1000_set_vco_speed(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007312{
Joe Perches406874a2008-04-03 10:06:32 -07007313 s32 ret_val;
7314 u16 default_page = 0;
7315 u16 phy_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007316
7317 DEBUGFUNC("e1000_set_vco_speed");
7318
Auke Kok8fc897b2006-08-28 14:56:16 -07007319 switch (hw->mac_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007320 case e1000_82545_rev_3:
7321 case e1000_82546_rev_3:
7322 break;
7323 default:
7324 return E1000_SUCCESS;
7325 }
7326
7327 /* Set PHY register 30, page 5, bit 8 to 0 */
7328
7329 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, &default_page);
Auke Kok8fc897b2006-08-28 14:56:16 -07007330 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007331 return ret_val;
7332
7333 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005);
Auke Kok8fc897b2006-08-28 14:56:16 -07007334 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007335 return ret_val;
7336
7337 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007338 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007339 return ret_val;
7340
7341 phy_data &= ~M88E1000_PHY_VCO_REG_BIT8;
7342 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007343 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007344 return ret_val;
7345
7346 /* Set PHY register 30, page 4, bit 11 to 1 */
7347
7348 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0004);
Auke Kok8fc897b2006-08-28 14:56:16 -07007349 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007350 return ret_val;
7351
7352 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007353 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007354 return ret_val;
7355
7356 phy_data |= M88E1000_PHY_VCO_REG_BIT11;
7357 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
Auke Kok8fc897b2006-08-28 14:56:16 -07007358 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007359 return ret_val;
7360
7361 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, default_page);
Auke Kok8fc897b2006-08-28 14:56:16 -07007362 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007363 return ret_val;
7364
7365 return E1000_SUCCESS;
7366}
7367
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007368
7369/*****************************************************************************
7370 * This function reads the cookie from ARC ram.
7371 *
7372 * returns: - E1000_SUCCESS .
7373 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007374static s32 e1000_host_if_read_cookie(struct e1000_hw *hw, u8 *buffer)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007375{
Joe Perches406874a2008-04-03 10:06:32 -07007376 u8 i;
7377 u32 offset = E1000_MNG_DHCP_COOKIE_OFFSET;
7378 u8 length = E1000_MNG_DHCP_COOKIE_LENGTH;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007379
7380 length = (length >> 2);
7381 offset = (offset >> 2);
7382
7383 for (i = 0; i < length; i++) {
Joe Perchese982f172008-07-11 15:17:18 -07007384 *((u32 *)buffer + i) =
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007385 E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset + i);
7386 }
7387 return E1000_SUCCESS;
7388}
7389
7390
7391/*****************************************************************************
7392 * This function checks whether the HOST IF is enabled for command operaton
7393 * and also checks whether the previous command is completed.
7394 * It busy waits in case of previous command is not completed.
7395 *
Auke Kok76c224b2006-05-23 13:36:06 -07007396 * returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007397 * timeout
7398 * - E1000_SUCCESS for success.
7399 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007400static s32 e1000_mng_enable_host_if(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007401{
Joe Perches406874a2008-04-03 10:06:32 -07007402 u32 hicr;
7403 u8 i;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007404
7405 /* Check that the host interface is enabled. */
Joe Perches1dc32912008-07-11 15:17:08 -07007406 hicr = er32(HICR);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007407 if ((hicr & E1000_HICR_EN) == 0) {
7408 DEBUGOUT("E1000_HOST_EN bit disabled.\n");
7409 return -E1000_ERR_HOST_INTERFACE_COMMAND;
7410 }
7411 /* check the previous command is completed */
7412 for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) {
Joe Perches1dc32912008-07-11 15:17:08 -07007413 hicr = er32(HICR);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007414 if (!(hicr & E1000_HICR_C))
7415 break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007416 mdelay(1);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007417 }
7418
Auke Kok76c224b2006-05-23 13:36:06 -07007419 if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007420 DEBUGOUT("Previous command timeout failed .\n");
7421 return -E1000_ERR_HOST_INTERFACE_COMMAND;
7422 }
7423 return E1000_SUCCESS;
7424}
7425
7426/*****************************************************************************
7427 * This function writes the buffer content at the offset given on the host if.
7428 * It also does alignment considerations to do the writes in most efficient way.
7429 * Also fills up the sum of the buffer in *buffer parameter.
7430 *
7431 * returns - E1000_SUCCESS for success.
7432 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007433static s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length,
7434 u16 offset, u8 *sum)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007435{
Joe Perches406874a2008-04-03 10:06:32 -07007436 u8 *tmp;
7437 u8 *bufptr = buffer;
7438 u32 data = 0;
7439 u16 remaining, i, j, prev_bytes;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007440
7441 /* sum = only sum of the data and it is not checksum */
7442
7443 if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) {
7444 return -E1000_ERR_PARAM;
7445 }
7446
Joe Perches406874a2008-04-03 10:06:32 -07007447 tmp = (u8 *)&data;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007448 prev_bytes = offset & 0x3;
7449 offset &= 0xFFFC;
7450 offset >>= 2;
7451
7452 if (prev_bytes) {
7453 data = E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset);
Joe Perches406874a2008-04-03 10:06:32 -07007454 for (j = prev_bytes; j < sizeof(u32); j++) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007455 *(tmp + j) = *bufptr++;
7456 *sum += *(tmp + j);
7457 }
7458 E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset, data);
7459 length -= j - prev_bytes;
7460 offset++;
7461 }
7462
7463 remaining = length & 0x3;
7464 length -= remaining;
7465
7466 /* Calculate length in DWORDs */
7467 length >>= 2;
7468
7469 /* The device driver writes the relevant command block into the
7470 * ram area. */
7471 for (i = 0; i < length; i++) {
Joe Perches406874a2008-04-03 10:06:32 -07007472 for (j = 0; j < sizeof(u32); j++) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007473 *(tmp + j) = *bufptr++;
7474 *sum += *(tmp + j);
7475 }
7476
7477 E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);
7478 }
7479 if (remaining) {
Joe Perches406874a2008-04-03 10:06:32 -07007480 for (j = 0; j < sizeof(u32); j++) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007481 if (j < remaining)
7482 *(tmp + j) = *bufptr++;
7483 else
7484 *(tmp + j) = 0;
7485
7486 *sum += *(tmp + j);
7487 }
7488 E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);
7489 }
7490
7491 return E1000_SUCCESS;
7492}
7493
7494
7495/*****************************************************************************
7496 * This function writes the command header after does the checksum calculation.
7497 *
7498 * returns - E1000_SUCCESS for success.
7499 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007500static s32 e1000_mng_write_cmd_header(struct e1000_hw *hw,
7501 struct e1000_host_mng_command_header *hdr)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007502{
Joe Perches406874a2008-04-03 10:06:32 -07007503 u16 i;
7504 u8 sum;
7505 u8 *buffer;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007506
7507 /* Write the whole command header structure which includes sum of
7508 * the buffer */
7509
Joe Perches406874a2008-04-03 10:06:32 -07007510 u16 length = sizeof(struct e1000_host_mng_command_header);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007511
7512 sum = hdr->checksum;
7513 hdr->checksum = 0;
7514
Joe Perchese982f172008-07-11 15:17:18 -07007515 buffer = (u8 *)hdr;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007516 i = length;
Auke Kok8fc897b2006-08-28 14:56:16 -07007517 while (i--)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007518 sum += buffer[i];
7519
7520 hdr->checksum = 0 - sum;
7521
7522 length >>= 2;
7523 /* The device driver writes the relevant command block into the ram area. */
Auke Kok4ca213a2006-06-27 09:07:08 -07007524 for (i = 0; i < length; i++) {
Joe Perchese982f172008-07-11 15:17:18 -07007525 E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, i, *((u32 *)hdr + i));
Joe Perches1dc32912008-07-11 15:17:08 -07007526 E1000_WRITE_FLUSH();
Auke Kok4ca213a2006-06-27 09:07:08 -07007527 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007528
7529 return E1000_SUCCESS;
7530}
7531
7532
7533/*****************************************************************************
7534 * This function indicates to ARC that a new command is pending which completes
7535 * one write operation by the driver.
7536 *
7537 * returns - E1000_SUCCESS for success.
7538 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007539static s32 e1000_mng_write_commit(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007540{
Joe Perches406874a2008-04-03 10:06:32 -07007541 u32 hicr;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007542
Joe Perches1dc32912008-07-11 15:17:08 -07007543 hicr = er32(HICR);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007544 /* Setting this bit tells the ARC that a new command is pending. */
Joe Perches1dc32912008-07-11 15:17:08 -07007545 ew32(HICR, hicr | E1000_HICR_C);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007546
7547 return E1000_SUCCESS;
7548}
7549
7550
7551/*****************************************************************************
7552 * This function checks the mode of the firmware.
7553 *
Joe Perchesc3033b02008-03-21 11:06:25 -07007554 * returns - true when the mode is IAMT or false.
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007555 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007556bool e1000_check_mng_mode(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007557{
Joe Perches406874a2008-04-03 10:06:32 -07007558 u32 fwsm;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007559
Joe Perches1dc32912008-07-11 15:17:08 -07007560 fwsm = er32(FWSM);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007561
Auke Kokcd94dd02006-06-27 09:08:22 -07007562 if (hw->mac_type == e1000_ich8lan) {
7563 if ((fwsm & E1000_FWSM_MODE_MASK) ==
7564 (E1000_MNG_ICH_IAMT_MODE << E1000_FWSM_MODE_SHIFT))
Joe Perchesc3033b02008-03-21 11:06:25 -07007565 return true;
Auke Kokcd94dd02006-06-27 09:08:22 -07007566 } else if ((fwsm & E1000_FWSM_MODE_MASK) ==
7567 (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT))
Joe Perchesc3033b02008-03-21 11:06:25 -07007568 return true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007569
Joe Perchesc3033b02008-03-21 11:06:25 -07007570 return false;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007571}
7572
7573
7574/*****************************************************************************
7575 * This function writes the dhcp info .
7576 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007577s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007578{
Joe Perches406874a2008-04-03 10:06:32 -07007579 s32 ret_val;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007580 struct e1000_host_mng_command_header hdr;
7581
7582 hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD;
7583 hdr.command_length = length;
7584 hdr.reserved1 = 0;
7585 hdr.reserved2 = 0;
7586 hdr.checksum = 0;
7587
7588 ret_val = e1000_mng_enable_host_if(hw);
7589 if (ret_val == E1000_SUCCESS) {
7590 ret_val = e1000_mng_host_if_write(hw, buffer, length, sizeof(hdr),
7591 &(hdr.checksum));
7592 if (ret_val == E1000_SUCCESS) {
7593 ret_val = e1000_mng_write_cmd_header(hw, &hdr);
7594 if (ret_val == E1000_SUCCESS)
7595 ret_val = e1000_mng_write_commit(hw);
7596 }
7597 }
7598 return ret_val;
7599}
7600
7601
7602/*****************************************************************************
7603 * This function calculates the checksum.
7604 *
7605 * returns - checksum of buffer contents.
7606 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007607static u8 e1000_calculate_mng_checksum(char *buffer, u32 length)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007608{
Joe Perches406874a2008-04-03 10:06:32 -07007609 u8 sum = 0;
7610 u32 i;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007611
7612 if (!buffer)
7613 return 0;
7614
7615 for (i=0; i < length; i++)
7616 sum += buffer[i];
7617
Joe Perchese982f172008-07-11 15:17:18 -07007618 return (u8)(0 - sum);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007619}
7620
7621/*****************************************************************************
7622 * This function checks whether tx pkt filtering needs to be enabled or not.
7623 *
Joe Perchesc3033b02008-03-21 11:06:25 -07007624 * returns - true for packet filtering or false.
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007625 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007626bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007627{
7628 /* called in init as well as watchdog timer functions */
7629
Joe Perches406874a2008-04-03 10:06:32 -07007630 s32 ret_val, checksum;
Joe Perchesc3033b02008-03-21 11:06:25 -07007631 bool tx_filter = false;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007632 struct e1000_host_mng_dhcp_cookie *hdr = &(hw->mng_cookie);
Joe Perches406874a2008-04-03 10:06:32 -07007633 u8 *buffer = (u8 *) &(hw->mng_cookie);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007634
7635 if (e1000_check_mng_mode(hw)) {
7636 ret_val = e1000_mng_enable_host_if(hw);
7637 if (ret_val == E1000_SUCCESS) {
7638 ret_val = e1000_host_if_read_cookie(hw, buffer);
7639 if (ret_val == E1000_SUCCESS) {
7640 checksum = hdr->checksum;
7641 hdr->checksum = 0;
7642 if ((hdr->signature == E1000_IAMT_SIGNATURE) &&
7643 checksum == e1000_calculate_mng_checksum((char *)buffer,
7644 E1000_MNG_DHCP_COOKIE_LENGTH)) {
7645 if (hdr->status &
7646 E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT)
Joe Perchesc3033b02008-03-21 11:06:25 -07007647 tx_filter = true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007648 } else
Joe Perchesc3033b02008-03-21 11:06:25 -07007649 tx_filter = true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007650 } else
Joe Perchesc3033b02008-03-21 11:06:25 -07007651 tx_filter = true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007652 }
7653 }
7654
7655 hw->tx_pkt_filtering = tx_filter;
7656 return tx_filter;
7657}
7658
7659/******************************************************************************
7660 * Verifies the hardware needs to allow ARPs to be processed by the host
7661 *
7662 * hw - Struct containing variables accessed by shared code
7663 *
Joe Perchesc3033b02008-03-21 11:06:25 -07007664 * returns: - true/false
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007665 *
7666 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007667u32 e1000_enable_mng_pass_thru(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007668{
Joe Perches406874a2008-04-03 10:06:32 -07007669 u32 manc;
7670 u32 fwsm, factps;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007671
7672 if (hw->asf_firmware_present) {
Joe Perches1dc32912008-07-11 15:17:08 -07007673 manc = er32(MANC);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007674
7675 if (!(manc & E1000_MANC_RCV_TCO_EN) ||
7676 !(manc & E1000_MANC_EN_MAC_ADDR_FILTER))
Joe Perchesc3033b02008-03-21 11:06:25 -07007677 return false;
7678 if (e1000_arc_subsystem_valid(hw)) {
Joe Perches1dc32912008-07-11 15:17:08 -07007679 fwsm = er32(FWSM);
7680 factps = er32(FACTPS);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007681
Jeff Garzik0fccd0e2006-12-15 10:56:10 -05007682 if ((((fwsm & E1000_FWSM_MODE_MASK) >> E1000_FWSM_MODE_SHIFT) ==
7683 e1000_mng_mode_pt) && !(factps & E1000_FACTPS_MNGCG))
Joe Perchesc3033b02008-03-21 11:06:25 -07007684 return true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007685 } else
7686 if ((manc & E1000_MANC_SMBUS_EN) && !(manc & E1000_MANC_ASF_EN))
Joe Perchesc3033b02008-03-21 11:06:25 -07007687 return true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007688 }
Joe Perchesc3033b02008-03-21 11:06:25 -07007689 return false;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007690}
7691
Joe Perches64798842008-07-11 15:17:02 -07007692static s32 e1000_polarity_reversal_workaround(struct e1000_hw *hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007693{
Joe Perches406874a2008-04-03 10:06:32 -07007694 s32 ret_val;
7695 u16 mii_status_reg;
7696 u16 i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007697
7698 /* Polarity reversal workaround for forced 10F/10H links. */
7699
7700 /* Disable the transmitter on the PHY */
7701
7702 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
Auke Kok8fc897b2006-08-28 14:56:16 -07007703 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007704 return ret_val;
7705 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFFF);
Auke Kok8fc897b2006-08-28 14:56:16 -07007706 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007707 return ret_val;
7708
7709 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000);
Auke Kok8fc897b2006-08-28 14:56:16 -07007710 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007711 return ret_val;
7712
7713 /* This loop will early-out if the NO link condition has been met. */
Auke Kok8fc897b2006-08-28 14:56:16 -07007714 for (i = PHY_FORCE_TIME; i > 0; i--) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007715 /* Read the MII Status Register and wait for Link Status bit
7716 * to be clear.
7717 */
7718
7719 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07007720 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007721 return ret_val;
7722
7723 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07007724 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007725 return ret_val;
7726
Auke Kok8fc897b2006-08-28 14:56:16 -07007727 if ((mii_status_reg & ~MII_SR_LINK_STATUS) == 0) break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007728 mdelay(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007729 }
7730
7731 /* Recommended delay time after link has been lost */
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007732 mdelay(1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007733
7734 /* Now we will re-enable th transmitter on the PHY */
7735
7736 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
Auke Kok8fc897b2006-08-28 14:56:16 -07007737 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007738 return ret_val;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007739 mdelay(50);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007740 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFF0);
Auke Kok8fc897b2006-08-28 14:56:16 -07007741 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007742 return ret_val;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007743 mdelay(50);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007744 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFF00);
Auke Kok8fc897b2006-08-28 14:56:16 -07007745 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007746 return ret_val;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007747 mdelay(50);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007748 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0x0000);
Auke Kok8fc897b2006-08-28 14:56:16 -07007749 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007750 return ret_val;
7751
7752 ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000);
Auke Kok8fc897b2006-08-28 14:56:16 -07007753 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007754 return ret_val;
7755
7756 /* This loop will early-out if the link condition has been met. */
Auke Kok8fc897b2006-08-28 14:56:16 -07007757 for (i = PHY_FORCE_TIME; i > 0; i--) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007758 /* Read the MII Status Register and wait for Link Status bit
7759 * to be set.
7760 */
7761
7762 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07007763 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007764 return ret_val;
7765
7766 ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
Auke Kok8fc897b2006-08-28 14:56:16 -07007767 if (ret_val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007768 return ret_val;
7769
Auke Kok8fc897b2006-08-28 14:56:16 -07007770 if (mii_status_reg & MII_SR_LINK_STATUS) break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007771 mdelay(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007772 }
7773 return E1000_SUCCESS;
7774}
7775
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007776/***************************************************************************
7777 *
7778 * Disables PCI-Express master access.
7779 *
7780 * hw: Struct containing variables accessed by shared code
7781 *
7782 * returns: - none.
7783 *
7784 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007785static void e1000_set_pci_express_master_disable(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007786{
Joe Perches406874a2008-04-03 10:06:32 -07007787 u32 ctrl;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007788
7789 DEBUGFUNC("e1000_set_pci_express_master_disable");
7790
7791 if (hw->bus_type != e1000_bus_type_pci_express)
7792 return;
7793
Joe Perches1dc32912008-07-11 15:17:08 -07007794 ctrl = er32(CTRL);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007795 ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
Joe Perches1dc32912008-07-11 15:17:08 -07007796 ew32(CTRL, ctrl);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007797}
7798
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007799/*******************************************************************************
7800 *
7801 * Disables PCI-Express master access and verifies there are no pending requests
7802 *
7803 * hw: Struct containing variables accessed by shared code
7804 *
7805 * returns: - E1000_ERR_MASTER_REQUESTS_PENDING if master disable bit hasn't
7806 * caused the master requests to be disabled.
7807 * E1000_SUCCESS master requests disabled.
7808 *
7809 ******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007810s32 e1000_disable_pciex_master(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007811{
Joe Perches406874a2008-04-03 10:06:32 -07007812 s32 timeout = MASTER_DISABLE_TIMEOUT; /* 80ms */
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007813
7814 DEBUGFUNC("e1000_disable_pciex_master");
7815
7816 if (hw->bus_type != e1000_bus_type_pci_express)
7817 return E1000_SUCCESS;
7818
7819 e1000_set_pci_express_master_disable(hw);
7820
Auke Kok8fc897b2006-08-28 14:56:16 -07007821 while (timeout) {
Joe Perches1dc32912008-07-11 15:17:08 -07007822 if (!(er32(STATUS) & E1000_STATUS_GIO_MASTER_ENABLE))
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007823 break;
7824 else
7825 udelay(100);
7826 timeout--;
7827 }
7828
Auke Kok8fc897b2006-08-28 14:56:16 -07007829 if (!timeout) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007830 DEBUGOUT("Master requests are pending.\n");
7831 return -E1000_ERR_MASTER_REQUESTS_PENDING;
7832 }
7833
7834 return E1000_SUCCESS;
7835}
7836
7837/*******************************************************************************
7838 *
7839 * Check for EEPROM Auto Read bit done.
7840 *
7841 * hw: Struct containing variables accessed by shared code
7842 *
7843 * returns: - E1000_ERR_RESET if fail to reset MAC
7844 * E1000_SUCCESS at any other case.
7845 *
7846 ******************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007847static s32 e1000_get_auto_rd_done(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007848{
Joe Perches406874a2008-04-03 10:06:32 -07007849 s32 timeout = AUTO_READ_DONE_TIMEOUT;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007850
7851 DEBUGFUNC("e1000_get_auto_rd_done");
7852
7853 switch (hw->mac_type) {
7854 default:
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007855 msleep(5);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007856 break;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007857 case e1000_82571:
7858 case e1000_82572:
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007859 case e1000_82573:
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08007860 case e1000_80003es2lan:
Auke Kokcd94dd02006-06-27 09:08:22 -07007861 case e1000_ich8lan:
7862 while (timeout) {
Joe Perches1dc32912008-07-11 15:17:08 -07007863 if (er32(EECD) & E1000_EECD_AUTO_RD)
Auke Kokcd94dd02006-06-27 09:08:22 -07007864 break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007865 else msleep(1);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007866 timeout--;
7867 }
7868
Auke Kok8fc897b2006-08-28 14:56:16 -07007869 if (!timeout) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007870 DEBUGOUT("Auto read by HW from EEPROM has not completed.\n");
7871 return -E1000_ERR_RESET;
7872 }
7873 break;
7874 }
7875
Jeff Kirsherfd803242005-12-13 00:06:22 -05007876 /* PHY configuration from NVM just starts after EECD_AUTO_RD sets to high.
7877 * Need to wait for PHY configuration completion before accessing NVM
7878 * and PHY. */
7879 if (hw->mac_type == e1000_82573)
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007880 msleep(25);
Jeff Kirsherfd803242005-12-13 00:06:22 -05007881
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007882 return E1000_SUCCESS;
7883}
7884
7885/***************************************************************************
7886 * Checks if the PHY configuration is done
7887 *
7888 * hw: Struct containing variables accessed by shared code
7889 *
7890 * returns: - E1000_ERR_RESET if fail to reset MAC
7891 * E1000_SUCCESS at any other case.
7892 *
7893 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007894static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007895{
Joe Perches406874a2008-04-03 10:06:32 -07007896 s32 timeout = PHY_CFG_TIMEOUT;
7897 u32 cfg_mask = E1000_EEPROM_CFG_DONE;
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007898
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007899 DEBUGFUNC("e1000_get_phy_cfg_done");
7900
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007901 switch (hw->mac_type) {
7902 default:
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007903 mdelay(10);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007904 break;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08007905 case e1000_80003es2lan:
7906 /* Separate *_CFG_DONE_* bit for each port */
Joe Perches1dc32912008-07-11 15:17:08 -07007907 if (er32(STATUS) & E1000_STATUS_FUNC_1)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08007908 cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1;
7909 /* Fall Through */
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007910 case e1000_82571:
7911 case e1000_82572:
7912 while (timeout) {
Joe Perches1dc32912008-07-11 15:17:08 -07007913 if (er32(EEMNGCTL) & cfg_mask)
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007914 break;
7915 else
Jeff Garzikf8ec4732006-09-19 15:27:07 -04007916 msleep(1);
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007917 timeout--;
7918 }
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04007919 if (!timeout) {
7920 DEBUGOUT("MNG configuration cycle has not completed.\n");
7921 return -E1000_ERR_RESET;
7922 }
7923 break;
7924 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007925
7926 return E1000_SUCCESS;
7927}
7928
7929/***************************************************************************
7930 *
7931 * Using the combination of SMBI and SWESMBI semaphore bits when resetting
7932 * adapter or Eeprom access.
7933 *
7934 * hw: Struct containing variables accessed by shared code
7935 *
7936 * returns: - E1000_ERR_EEPROM if fail to access EEPROM.
7937 * E1000_SUCCESS at any other case.
7938 *
7939 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007940static s32 e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007941{
Joe Perches406874a2008-04-03 10:06:32 -07007942 s32 timeout;
7943 u32 swsm;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007944
7945 DEBUGFUNC("e1000_get_hw_eeprom_semaphore");
7946
Auke Kok8fc897b2006-08-28 14:56:16 -07007947 if (!hw->eeprom_semaphore_present)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007948 return E1000_SUCCESS;
7949
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08007950 if (hw->mac_type == e1000_80003es2lan) {
7951 /* Get the SW semaphore. */
7952 if (e1000_get_software_semaphore(hw) != E1000_SUCCESS)
7953 return -E1000_ERR_EEPROM;
7954 }
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007955
7956 /* Get the FW semaphore. */
7957 timeout = hw->eeprom.word_size + 1;
Auke Kok8fc897b2006-08-28 14:56:16 -07007958 while (timeout) {
Joe Perches1dc32912008-07-11 15:17:08 -07007959 swsm = er32(SWSM);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007960 swsm |= E1000_SWSM_SWESMBI;
Joe Perches1dc32912008-07-11 15:17:08 -07007961 ew32(SWSM, swsm);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007962 /* if we managed to set the bit we got the semaphore. */
Joe Perches1dc32912008-07-11 15:17:08 -07007963 swsm = er32(SWSM);
Auke Kok8fc897b2006-08-28 14:56:16 -07007964 if (swsm & E1000_SWSM_SWESMBI)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007965 break;
7966
7967 udelay(50);
7968 timeout--;
7969 }
7970
Auke Kok8fc897b2006-08-28 14:56:16 -07007971 if (!timeout) {
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007972 /* Release semaphores */
7973 e1000_put_hw_eeprom_semaphore(hw);
7974 DEBUGOUT("Driver can't access the Eeprom - SWESMBI bit is set.\n");
7975 return -E1000_ERR_EEPROM;
7976 }
7977
7978 return E1000_SUCCESS;
7979}
7980
7981/***************************************************************************
7982 * This function clears HW semaphore bits.
7983 *
7984 * hw: Struct containing variables accessed by shared code
7985 *
7986 * returns: - None.
7987 *
7988 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07007989static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007990{
Joe Perches406874a2008-04-03 10:06:32 -07007991 u32 swsm;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007992
7993 DEBUGFUNC("e1000_put_hw_eeprom_semaphore");
7994
Auke Kok8fc897b2006-08-28 14:56:16 -07007995 if (!hw->eeprom_semaphore_present)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07007996 return;
7997
Joe Perches1dc32912008-07-11 15:17:08 -07007998 swsm = er32(SWSM);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08007999 if (hw->mac_type == e1000_80003es2lan) {
8000 /* Release both semaphores. */
8001 swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
8002 } else
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04008003 swsm &= ~(E1000_SWSM_SWESMBI);
Joe Perches1dc32912008-07-11 15:17:08 -07008004 ew32(SWSM, swsm);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008005}
8006
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008007/***************************************************************************
8008 *
8009 * Obtaining software semaphore bit (SMBI) before resetting PHY.
8010 *
8011 * hw: Struct containing variables accessed by shared code
8012 *
8013 * returns: - E1000_ERR_RESET if fail to obtain semaphore.
8014 * E1000_SUCCESS at any other case.
8015 *
8016 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008017static s32 e1000_get_software_semaphore(struct e1000_hw *hw)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008018{
Joe Perches406874a2008-04-03 10:06:32 -07008019 s32 timeout = hw->eeprom.word_size + 1;
8020 u32 swsm;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008021
8022 DEBUGFUNC("e1000_get_software_semaphore");
8023
Nicholas Nunley35574762006-09-27 12:53:34 -07008024 if (hw->mac_type != e1000_80003es2lan) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008025 return E1000_SUCCESS;
Nicholas Nunley35574762006-09-27 12:53:34 -07008026 }
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008027
Auke Kok8fc897b2006-08-28 14:56:16 -07008028 while (timeout) {
Joe Perches1dc32912008-07-11 15:17:08 -07008029 swsm = er32(SWSM);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008030 /* If SMBI bit cleared, it is now set and we hold the semaphore */
Auke Kok8fc897b2006-08-28 14:56:16 -07008031 if (!(swsm & E1000_SWSM_SMBI))
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008032 break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04008033 mdelay(1);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008034 timeout--;
8035 }
8036
Auke Kok8fc897b2006-08-28 14:56:16 -07008037 if (!timeout) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008038 DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
8039 return -E1000_ERR_RESET;
8040 }
8041
8042 return E1000_SUCCESS;
8043}
8044
8045/***************************************************************************
8046 *
8047 * Release semaphore bit (SMBI).
8048 *
8049 * hw: Struct containing variables accessed by shared code
8050 *
8051 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008052static void e1000_release_software_semaphore(struct e1000_hw *hw)
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008053{
Joe Perches406874a2008-04-03 10:06:32 -07008054 u32 swsm;
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008055
8056 DEBUGFUNC("e1000_release_software_semaphore");
8057
Nicholas Nunley35574762006-09-27 12:53:34 -07008058 if (hw->mac_type != e1000_80003es2lan) {
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008059 return;
Nicholas Nunley35574762006-09-27 12:53:34 -07008060 }
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008061
Joe Perches1dc32912008-07-11 15:17:08 -07008062 swsm = er32(SWSM);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008063 /* Release the SW semaphores.*/
8064 swsm &= ~E1000_SWSM_SMBI;
Joe Perches1dc32912008-07-11 15:17:08 -07008065 ew32(SWSM, swsm);
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008066}
8067
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008068/******************************************************************************
8069 * Checks if PHY reset is blocked due to SOL/IDER session, for example.
8070 * Returning E1000_BLK_PHY_RESET isn't necessarily an error. But it's up to
8071 * the caller to figure out how to deal with it.
8072 *
8073 * hw - Struct containing variables accessed by shared code
8074 *
8075 * returns: - E1000_BLK_PHY_RESET
8076 * E1000_SUCCESS
8077 *
8078 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008079s32 e1000_check_phy_reset_block(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008080{
Joe Perches406874a2008-04-03 10:06:32 -07008081 u32 manc = 0;
8082 u32 fwsm = 0;
Auke Kokcd94dd02006-06-27 09:08:22 -07008083
8084 if (hw->mac_type == e1000_ich8lan) {
Joe Perches1dc32912008-07-11 15:17:08 -07008085 fwsm = er32(FWSM);
Auke Kokcd94dd02006-06-27 09:08:22 -07008086 return (fwsm & E1000_FWSM_RSPCIPHY) ? E1000_SUCCESS
8087 : E1000_BLK_PHY_RESET;
8088 }
Jesse Brandeburg96838a42006-01-18 13:01:39 -08008089
8090 if (hw->mac_type > e1000_82547_rev_2)
Joe Perches1dc32912008-07-11 15:17:08 -07008091 manc = er32(MANC);
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008092 return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ?
Nicholas Nunley35574762006-09-27 12:53:34 -07008093 E1000_BLK_PHY_RESET : E1000_SUCCESS;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008094}
8095
Joe Perches64798842008-07-11 15:17:02 -07008096static u8 e1000_arc_subsystem_valid(struct e1000_hw *hw)
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008097{
Joe Perches406874a2008-04-03 10:06:32 -07008098 u32 fwsm;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008099
8100 /* On 8257x silicon, registers in the range of 0x8800 - 0x8FFC
8101 * may not be provided a DMA clock when no manageability features are
8102 * enabled. We do not want to perform any reads/writes to these registers
8103 * if this is the case. We read FWSM to determine the manageability mode.
8104 */
8105 switch (hw->mac_type) {
Mallikarjuna R Chilakala868d5302005-10-04 06:58:59 -04008106 case e1000_82571:
8107 case e1000_82572:
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008108 case e1000_82573:
Jeff Kirsher6418ecc2006-03-02 18:21:10 -08008109 case e1000_80003es2lan:
Joe Perches1dc32912008-07-11 15:17:08 -07008110 fwsm = er32(FWSM);
Auke Kok8fc897b2006-08-28 14:56:16 -07008111 if ((fwsm & E1000_FWSM_MODE_MASK) != 0)
Joe Perchesc3033b02008-03-21 11:06:25 -07008112 return true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008113 break;
Auke Kokcd94dd02006-06-27 09:08:22 -07008114 case e1000_ich8lan:
Joe Perchesc3033b02008-03-21 11:06:25 -07008115 return true;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008116 default:
8117 break;
8118 }
Joe Perchesc3033b02008-03-21 11:06:25 -07008119 return false;
Malli Chilakala2d7edb92005-04-28 19:43:52 -07008120}
8121
8122
Auke Kokd37ea5d2006-06-27 09:08:17 -07008123/******************************************************************************
8124 * Configure PCI-Ex no-snoop
8125 *
8126 * hw - Struct containing variables accessed by shared code.
8127 * no_snoop - Bitmap of no-snoop events.
8128 *
8129 * returns: E1000_SUCCESS
8130 *
8131 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008132static s32 e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, u32 no_snoop)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008133{
Joe Perches406874a2008-04-03 10:06:32 -07008134 u32 gcr_reg = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008135
8136 DEBUGFUNC("e1000_set_pci_ex_no_snoop");
8137
8138 if (hw->bus_type == e1000_bus_type_unknown)
8139 e1000_get_bus_info(hw);
8140
8141 if (hw->bus_type != e1000_bus_type_pci_express)
8142 return E1000_SUCCESS;
8143
8144 if (no_snoop) {
Joe Perches1dc32912008-07-11 15:17:08 -07008145 gcr_reg = er32(GCR);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008146 gcr_reg &= ~(PCI_EX_NO_SNOOP_ALL);
8147 gcr_reg |= no_snoop;
Joe Perches1dc32912008-07-11 15:17:08 -07008148 ew32(GCR, gcr_reg);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008149 }
8150 if (hw->mac_type == e1000_ich8lan) {
Joe Perches406874a2008-04-03 10:06:32 -07008151 u32 ctrl_ext;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008152
Joe Perches1dc32912008-07-11 15:17:08 -07008153 ew32(GCR, PCI_EX_82566_SNOOP_ALL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008154
Joe Perches1dc32912008-07-11 15:17:08 -07008155 ctrl_ext = er32(CTRL_EXT);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008156 ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
Joe Perches1dc32912008-07-11 15:17:08 -07008157 ew32(CTRL_EXT, ctrl_ext);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008158 }
8159
8160 return E1000_SUCCESS;
8161}
8162
8163/***************************************************************************
8164 *
8165 * Get software semaphore FLAG bit (SWFLAG).
8166 * SWFLAG is used to synchronize the access to all shared resource between
8167 * SW, FW and HW.
8168 *
8169 * hw: Struct containing variables accessed by shared code
8170 *
8171 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008172static s32 e1000_get_software_flag(struct e1000_hw *hw)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008173{
Joe Perches406874a2008-04-03 10:06:32 -07008174 s32 timeout = PHY_CFG_TIMEOUT;
8175 u32 extcnf_ctrl;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008176
8177 DEBUGFUNC("e1000_get_software_flag");
8178
8179 if (hw->mac_type == e1000_ich8lan) {
8180 while (timeout) {
Joe Perches1dc32912008-07-11 15:17:08 -07008181 extcnf_ctrl = er32(EXTCNF_CTRL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008182 extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG;
Joe Perches1dc32912008-07-11 15:17:08 -07008183 ew32(EXTCNF_CTRL, extcnf_ctrl);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008184
Joe Perches1dc32912008-07-11 15:17:08 -07008185 extcnf_ctrl = er32(EXTCNF_CTRL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008186 if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)
8187 break;
Jeff Garzikf8ec4732006-09-19 15:27:07 -04008188 mdelay(1);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008189 timeout--;
8190 }
8191
8192 if (!timeout) {
8193 DEBUGOUT("FW or HW locks the resource too long.\n");
8194 return -E1000_ERR_CONFIG;
8195 }
8196 }
8197
8198 return E1000_SUCCESS;
8199}
8200
8201/***************************************************************************
8202 *
8203 * Release software semaphore FLAG bit (SWFLAG).
8204 * SWFLAG is used to synchronize the access to all shared resource between
8205 * SW, FW and HW.
8206 *
8207 * hw: Struct containing variables accessed by shared code
8208 *
8209 ***************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008210static void e1000_release_software_flag(struct e1000_hw *hw)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008211{
Joe Perches406874a2008-04-03 10:06:32 -07008212 u32 extcnf_ctrl;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008213
8214 DEBUGFUNC("e1000_release_software_flag");
8215
8216 if (hw->mac_type == e1000_ich8lan) {
Joe Perches1dc32912008-07-11 15:17:08 -07008217 extcnf_ctrl= er32(EXTCNF_CTRL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008218 extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG;
Joe Perches1dc32912008-07-11 15:17:08 -07008219 ew32(EXTCNF_CTRL, extcnf_ctrl);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008220 }
8221
8222 return;
8223}
8224
Auke Kokd37ea5d2006-06-27 09:08:17 -07008225/******************************************************************************
8226 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
8227 * register.
8228 *
8229 * hw - Struct containing variables accessed by shared code
8230 * offset - offset of word in the EEPROM to read
8231 * data - word read from the EEPROM
8232 * words - number of words to read
8233 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008234static s32 e1000_read_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
8235 u16 *data)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008236{
Joe Perches406874a2008-04-03 10:06:32 -07008237 s32 error = E1000_SUCCESS;
8238 u32 flash_bank = 0;
8239 u32 act_offset = 0;
8240 u32 bank_offset = 0;
8241 u16 word = 0;
8242 u16 i = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008243
8244 /* We need to know which is the valid flash bank. In the event
8245 * that we didn't allocate eeprom_shadow_ram, we may not be
8246 * managing flash_bank. So it cannot be trusted and needs
8247 * to be updated with each read.
8248 */
8249 /* Value of bit 22 corresponds to the flash bank we're on. */
Joe Perches1dc32912008-07-11 15:17:08 -07008250 flash_bank = (er32(EECD) & E1000_EECD_SEC1VAL) ? 1 : 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008251
8252 /* Adjust offset appropriately if we're on bank 1 - adjust for word size */
8253 bank_offset = flash_bank * (hw->flash_bank_size * 2);
8254
8255 error = e1000_get_software_flag(hw);
8256 if (error != E1000_SUCCESS)
8257 return error;
8258
8259 for (i = 0; i < words; i++) {
8260 if (hw->eeprom_shadow_ram != NULL &&
Joe Perchesc3033b02008-03-21 11:06:25 -07008261 hw->eeprom_shadow_ram[offset+i].modified) {
Auke Kokd37ea5d2006-06-27 09:08:17 -07008262 data[i] = hw->eeprom_shadow_ram[offset+i].eeprom_word;
8263 } else {
8264 /* The NVM part needs a byte offset, hence * 2 */
8265 act_offset = bank_offset + ((offset + i) * 2);
8266 error = e1000_read_ich8_word(hw, act_offset, &word);
8267 if (error != E1000_SUCCESS)
8268 break;
8269 data[i] = word;
8270 }
8271 }
8272
8273 e1000_release_software_flag(hw);
8274
8275 return error;
8276}
8277
8278/******************************************************************************
8279 * Writes a 16 bit word or words to the EEPROM using the ICH8's flash access
8280 * register. Actually, writes are written to the shadow ram cache in the hw
8281 * structure hw->e1000_shadow_ram. e1000_commit_shadow_ram flushes this to
8282 * the NVM, which occurs when the NVM checksum is updated.
8283 *
8284 * hw - Struct containing variables accessed by shared code
8285 * offset - offset of word in the EEPROM to write
8286 * words - number of words to write
8287 * data - words to write to the EEPROM
8288 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008289static s32 e1000_write_eeprom_ich8(struct e1000_hw *hw, u16 offset, u16 words,
8290 u16 *data)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008291{
Joe Perches406874a2008-04-03 10:06:32 -07008292 u32 i = 0;
8293 s32 error = E1000_SUCCESS;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008294
8295 error = e1000_get_software_flag(hw);
8296 if (error != E1000_SUCCESS)
8297 return error;
8298
8299 /* A driver can write to the NVM only if it has eeprom_shadow_ram
8300 * allocated. Subsequent reads to the modified words are read from
8301 * this cached structure as well. Writes will only go into this
8302 * cached structure unless it's followed by a call to
8303 * e1000_update_eeprom_checksum() where it will commit the changes
8304 * and clear the "modified" field.
8305 */
8306 if (hw->eeprom_shadow_ram != NULL) {
8307 for (i = 0; i < words; i++) {
8308 if ((offset + i) < E1000_SHADOW_RAM_WORDS) {
Joe Perchesc3033b02008-03-21 11:06:25 -07008309 hw->eeprom_shadow_ram[offset+i].modified = true;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008310 hw->eeprom_shadow_ram[offset+i].eeprom_word = data[i];
8311 } else {
8312 error = -E1000_ERR_EEPROM;
8313 break;
8314 }
8315 }
8316 } else {
8317 /* Drivers have the option to not allocate eeprom_shadow_ram as long
8318 * as they don't perform any NVM writes. An attempt in doing so
8319 * will result in this error.
8320 */
8321 error = -E1000_ERR_EEPROM;
8322 }
8323
8324 e1000_release_software_flag(hw);
8325
8326 return error;
8327}
8328
8329/******************************************************************************
8330 * This function does initial flash setup so that a new read/write/erase cycle
8331 * can be started.
8332 *
8333 * hw - The pointer to the hw structure
8334 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008335static s32 e1000_ich8_cycle_init(struct e1000_hw *hw)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008336{
8337 union ich8_hws_flash_status hsfsts;
Joe Perches406874a2008-04-03 10:06:32 -07008338 s32 error = E1000_ERR_EEPROM;
8339 s32 i = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008340
8341 DEBUGFUNC("e1000_ich8_cycle_init");
8342
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008343 hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008344
8345 /* May be check the Flash Des Valid bit in Hw status */
8346 if (hsfsts.hsf_status.fldesvalid == 0) {
8347 DEBUGOUT("Flash descriptor invalid. SW Sequencing must be used.");
8348 return error;
8349 }
8350
8351 /* Clear FCERR in Hw status by writing 1 */
8352 /* Clear DAEL in Hw status by writing a 1 */
8353 hsfsts.hsf_status.flcerr = 1;
8354 hsfsts.hsf_status.dael = 1;
8355
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008356 E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS, hsfsts.regval);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008357
8358 /* Either we should have a hardware SPI cycle in progress bit to check
8359 * against, in order to start a new cycle or FDONE bit should be changed
8360 * in the hardware so that it is 1 after harware reset, which can then be
8361 * used as an indication whether a cycle is in progress or has been
8362 * completed .. we should also have some software semaphore mechanism to
8363 * guard FDONE or the cycle in progress bit so that two threads access to
8364 * those bits can be sequentiallized or a way so that 2 threads dont
8365 * start the cycle at the same time */
8366
8367 if (hsfsts.hsf_status.flcinprog == 0) {
8368 /* There is no cycle running at present, so we can start a cycle */
8369 /* Begin by setting Flash Cycle Done. */
8370 hsfsts.hsf_status.flcdone = 1;
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008371 E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS, hsfsts.regval);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008372 error = E1000_SUCCESS;
8373 } else {
8374 /* otherwise poll for sometime so the current cycle has a chance
8375 * to end before giving up. */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008376 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
8377 hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008378 if (hsfsts.hsf_status.flcinprog == 0) {
8379 error = E1000_SUCCESS;
8380 break;
8381 }
8382 udelay(1);
8383 }
8384 if (error == E1000_SUCCESS) {
8385 /* Successful in waiting for previous cycle to timeout,
8386 * now set the Flash Cycle Done. */
8387 hsfsts.hsf_status.flcdone = 1;
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008388 E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS, hsfsts.regval);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008389 } else {
8390 DEBUGOUT("Flash controller busy, cannot get access");
8391 }
8392 }
8393 return error;
8394}
8395
8396/******************************************************************************
8397 * This function starts a flash cycle and waits for its completion
8398 *
8399 * hw - The pointer to the hw structure
8400 ****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008401static s32 e1000_ich8_flash_cycle(struct e1000_hw *hw, u32 timeout)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008402{
8403 union ich8_hws_flash_ctrl hsflctl;
8404 union ich8_hws_flash_status hsfsts;
Joe Perches406874a2008-04-03 10:06:32 -07008405 s32 error = E1000_ERR_EEPROM;
8406 u32 i = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008407
8408 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008409 hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008410 hsflctl.hsf_ctrl.flcgo = 1;
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008411 E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008412
8413 /* wait till FDONE bit is set to 1 */
8414 do {
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008415 hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008416 if (hsfsts.hsf_status.flcdone == 1)
8417 break;
8418 udelay(1);
8419 i++;
8420 } while (i < timeout);
8421 if (hsfsts.hsf_status.flcdone == 1 && hsfsts.hsf_status.flcerr == 0) {
8422 error = E1000_SUCCESS;
8423 }
8424 return error;
8425}
8426
8427/******************************************************************************
8428 * Reads a byte or word from the NVM using the ICH8 flash access registers.
8429 *
8430 * hw - The pointer to the hw structure
8431 * index - The index of the byte or word to read.
8432 * size - Size of data to read, 1=byte 2=word
8433 * data - Pointer to the word to store the value read.
8434 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008435static s32 e1000_read_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
8436 u16 *data)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008437{
8438 union ich8_hws_flash_status hsfsts;
8439 union ich8_hws_flash_ctrl hsflctl;
Joe Perches406874a2008-04-03 10:06:32 -07008440 u32 flash_linear_address;
8441 u32 flash_data = 0;
8442 s32 error = -E1000_ERR_EEPROM;
8443 s32 count = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008444
8445 DEBUGFUNC("e1000_read_ich8_data");
8446
Stephen Hemmingerabec42a2007-10-29 10:46:19 -07008447 if (size < 1 || size > 2 || data == NULL ||
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008448 index > ICH_FLASH_LINEAR_ADDR_MASK)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008449 return error;
8450
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008451 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
Auke Kokd37ea5d2006-06-27 09:08:17 -07008452 hw->flash_base_addr;
8453
8454 do {
8455 udelay(1);
8456 /* Steps */
8457 error = e1000_ich8_cycle_init(hw);
8458 if (error != E1000_SUCCESS)
8459 break;
8460
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008461 hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008462 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
8463 hsflctl.hsf_ctrl.fldbcount = size - 1;
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008464 hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_READ;
8465 E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008466
8467 /* Write the last 24 bits of index into Flash Linear address field in
8468 * Flash Address */
8469 /* TODO: TBD maybe check the index against the size of flash */
8470
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008471 E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FADDR, flash_linear_address);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008472
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008473 error = e1000_ich8_flash_cycle(hw, ICH_FLASH_COMMAND_TIMEOUT);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008474
8475 /* Check if FCERR is set to 1, if set to 1, clear it and try the whole
8476 * sequence a few more times, else read in (shift in) the Flash Data0,
8477 * the order is least significant byte first msb to lsb */
8478 if (error == E1000_SUCCESS) {
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008479 flash_data = E1000_READ_ICH_FLASH_REG(hw, ICH_FLASH_FDATA0);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008480 if (size == 1) {
Joe Perches406874a2008-04-03 10:06:32 -07008481 *data = (u8)(flash_data & 0x000000FF);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008482 } else if (size == 2) {
Joe Perches406874a2008-04-03 10:06:32 -07008483 *data = (u16)(flash_data & 0x0000FFFF);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008484 }
8485 break;
8486 } else {
8487 /* If we've gotten here, then things are probably completely hosed,
8488 * but if the error condition is detected, it won't hurt to give
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008489 * it another try...ICH_FLASH_CYCLE_REPEAT_COUNT times.
Auke Kokd37ea5d2006-06-27 09:08:17 -07008490 */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008491 hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008492 if (hsfsts.hsf_status.flcerr == 1) {
8493 /* Repeat for some time before giving up. */
8494 continue;
8495 } else if (hsfsts.hsf_status.flcdone == 0) {
8496 DEBUGOUT("Timeout error - flash cycle did not complete.");
8497 break;
8498 }
8499 }
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008500 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008501
8502 return error;
8503}
8504
8505/******************************************************************************
8506 * Writes One /two bytes to the NVM using the ICH8 flash access registers.
8507 *
8508 * hw - The pointer to the hw structure
8509 * index - The index of the byte/word to read.
8510 * size - Size of data to read, 1=byte 2=word
8511 * data - The byte(s) to write to the NVM.
8512 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008513static s32 e1000_write_ich8_data(struct e1000_hw *hw, u32 index, u32 size,
8514 u16 data)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008515{
8516 union ich8_hws_flash_status hsfsts;
8517 union ich8_hws_flash_ctrl hsflctl;
Joe Perches406874a2008-04-03 10:06:32 -07008518 u32 flash_linear_address;
8519 u32 flash_data = 0;
8520 s32 error = -E1000_ERR_EEPROM;
8521 s32 count = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008522
8523 DEBUGFUNC("e1000_write_ich8_data");
8524
8525 if (size < 1 || size > 2 || data > size * 0xff ||
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008526 index > ICH_FLASH_LINEAR_ADDR_MASK)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008527 return error;
8528
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008529 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
Auke Kokd37ea5d2006-06-27 09:08:17 -07008530 hw->flash_base_addr;
8531
8532 do {
8533 udelay(1);
8534 /* Steps */
8535 error = e1000_ich8_cycle_init(hw);
8536 if (error != E1000_SUCCESS)
8537 break;
8538
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008539 hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008540 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
8541 hsflctl.hsf_ctrl.fldbcount = size -1;
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008542 hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_WRITE;
8543 E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008544
8545 /* Write the last 24 bits of index into Flash Linear address field in
8546 * Flash Address */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008547 E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FADDR, flash_linear_address);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008548
8549 if (size == 1)
Joe Perches406874a2008-04-03 10:06:32 -07008550 flash_data = (u32)data & 0x00FF;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008551 else
Joe Perches406874a2008-04-03 10:06:32 -07008552 flash_data = (u32)data;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008553
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008554 E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FDATA0, flash_data);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008555
8556 /* check if FCERR is set to 1 , if set to 1, clear it and try the whole
8557 * sequence a few more times else done */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008558 error = e1000_ich8_flash_cycle(hw, ICH_FLASH_COMMAND_TIMEOUT);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008559 if (error == E1000_SUCCESS) {
8560 break;
8561 } else {
8562 /* If we're here, then things are most likely completely hosed,
8563 * but if the error condition is detected, it won't hurt to give
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008564 * it another try...ICH_FLASH_CYCLE_REPEAT_COUNT times.
Auke Kokd37ea5d2006-06-27 09:08:17 -07008565 */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008566 hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008567 if (hsfsts.hsf_status.flcerr == 1) {
8568 /* Repeat for some time before giving up. */
8569 continue;
8570 } else if (hsfsts.hsf_status.flcdone == 0) {
8571 DEBUGOUT("Timeout error - flash cycle did not complete.");
8572 break;
8573 }
8574 }
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008575 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008576
8577 return error;
8578}
8579
8580/******************************************************************************
8581 * Reads a single byte from the NVM using the ICH8 flash access registers.
8582 *
8583 * hw - pointer to e1000_hw structure
8584 * index - The index of the byte to read.
8585 * data - Pointer to a byte to store the value read.
8586 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008587static s32 e1000_read_ich8_byte(struct e1000_hw *hw, u32 index, u8 *data)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008588{
Joe Perches406874a2008-04-03 10:06:32 -07008589 s32 status = E1000_SUCCESS;
8590 u16 word = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008591
8592 status = e1000_read_ich8_data(hw, index, 1, &word);
8593 if (status == E1000_SUCCESS) {
Joe Perches406874a2008-04-03 10:06:32 -07008594 *data = (u8)word;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008595 }
8596
8597 return status;
8598}
8599
8600/******************************************************************************
8601 * Writes a single byte to the NVM using the ICH8 flash access registers.
8602 * Performs verification by reading back the value and then going through
8603 * a retry algorithm before giving up.
8604 *
8605 * hw - pointer to e1000_hw structure
8606 * index - The index of the byte to write.
8607 * byte - The byte to write to the NVM.
8608 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008609static s32 e1000_verify_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 byte)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008610{
Joe Perches406874a2008-04-03 10:06:32 -07008611 s32 error = E1000_SUCCESS;
8612 s32 program_retries = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008613
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008614 DEBUGOUT2("Byte := %2.2X Offset := %d\n", byte, index);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008615
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008616 error = e1000_write_ich8_byte(hw, index, byte);
8617
8618 if (error != E1000_SUCCESS) {
8619 for (program_retries = 0; program_retries < 100; program_retries++) {
8620 DEBUGOUT2("Retrying \t Byte := %2.2X Offset := %d\n", byte, index);
8621 error = e1000_write_ich8_byte(hw, index, byte);
8622 udelay(100);
8623 if (error == E1000_SUCCESS)
8624 break;
8625 }
Auke Kokd37ea5d2006-06-27 09:08:17 -07008626 }
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008627
Auke Kokd37ea5d2006-06-27 09:08:17 -07008628 if (program_retries == 100)
8629 error = E1000_ERR_EEPROM;
8630
8631 return error;
8632}
8633
8634/******************************************************************************
8635 * Writes a single byte to the NVM using the ICH8 flash access registers.
8636 *
8637 * hw - pointer to e1000_hw structure
8638 * index - The index of the byte to read.
8639 * data - The byte to write to the NVM.
8640 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008641static s32 e1000_write_ich8_byte(struct e1000_hw *hw, u32 index, u8 data)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008642{
Joe Perches406874a2008-04-03 10:06:32 -07008643 s32 status = E1000_SUCCESS;
8644 u16 word = (u16)data;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008645
8646 status = e1000_write_ich8_data(hw, index, 1, word);
8647
8648 return status;
8649}
8650
8651/******************************************************************************
8652 * Reads a word from the NVM using the ICH8 flash access registers.
8653 *
8654 * hw - pointer to e1000_hw structure
8655 * index - The starting byte index of the word to read.
8656 * data - Pointer to a word to store the value read.
8657 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008658static s32 e1000_read_ich8_word(struct e1000_hw *hw, u32 index, u16 *data)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008659{
Joe Perches406874a2008-04-03 10:06:32 -07008660 s32 status = E1000_SUCCESS;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008661 status = e1000_read_ich8_data(hw, index, 2, data);
8662 return status;
8663}
8664
8665/******************************************************************************
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008666 * Erases the bank specified. Each bank may be a 4, 8 or 64k block. Banks are 0
8667 * based.
Auke Kokd37ea5d2006-06-27 09:08:17 -07008668 *
8669 * hw - pointer to e1000_hw structure
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008670 * bank - 0 for first bank, 1 for second bank
8671 *
8672 * Note that this function may actually erase as much as 8 or 64 KBytes. The
8673 * amount of NVM used in each bank is a *minimum* of 4 KBytes, but in fact the
8674 * bank size may be 4, 8 or 64 KBytes
Auke Kokd37ea5d2006-06-27 09:08:17 -07008675 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008676static s32 e1000_erase_ich8_4k_segment(struct e1000_hw *hw, u32 bank)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008677{
8678 union ich8_hws_flash_status hsfsts;
8679 union ich8_hws_flash_ctrl hsflctl;
Joe Perches406874a2008-04-03 10:06:32 -07008680 u32 flash_linear_address;
8681 s32 count = 0;
8682 s32 error = E1000_ERR_EEPROM;
8683 s32 iteration;
8684 s32 sub_sector_size = 0;
8685 s32 bank_size;
8686 s32 j = 0;
8687 s32 error_flag = 0;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008688
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008689 hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008690
8691 /* Determine HW Sector size: Read BERASE bits of Hw flash Status register */
8692 /* 00: The Hw sector is 256 bytes, hence we need to erase 16
8693 * consecutive sectors. The start index for the nth Hw sector can be
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008694 * calculated as bank * 4096 + n * 256
Auke Kokd37ea5d2006-06-27 09:08:17 -07008695 * 01: The Hw sector is 4K bytes, hence we need to erase 1 sector.
8696 * The start index for the nth Hw sector can be calculated
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008697 * as bank * 4096
8698 * 10: The HW sector is 8K bytes
8699 * 11: The Hw sector size is 64K bytes */
Auke Kokd37ea5d2006-06-27 09:08:17 -07008700 if (hsfsts.hsf_status.berasesz == 0x0) {
8701 /* Hw sector size 256 */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008702 sub_sector_size = ICH_FLASH_SEG_SIZE_256;
8703 bank_size = ICH_FLASH_SECTOR_SIZE;
8704 iteration = ICH_FLASH_SECTOR_SIZE / ICH_FLASH_SEG_SIZE_256;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008705 } else if (hsfsts.hsf_status.berasesz == 0x1) {
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008706 bank_size = ICH_FLASH_SEG_SIZE_4K;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008707 iteration = 1;
8708 } else if (hsfsts.hsf_status.berasesz == 0x3) {
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008709 bank_size = ICH_FLASH_SEG_SIZE_64K;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008710 iteration = 1;
8711 } else {
8712 return error;
8713 }
8714
8715 for (j = 0; j < iteration ; j++) {
8716 do {
8717 count++;
8718 /* Steps */
8719 error = e1000_ich8_cycle_init(hw);
8720 if (error != E1000_SUCCESS) {
8721 error_flag = 1;
8722 break;
8723 }
8724
8725 /* Write a value 11 (block Erase) in Flash Cycle field in Hw flash
8726 * Control */
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008727 hsflctl.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
8728 hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_ERASE;
8729 E1000_WRITE_ICH_FLASH_REG16(hw, ICH_FLASH_HSFCTL, hsflctl.regval);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008730
8731 /* Write the last 24 bits of an index within the block into Flash
8732 * Linear address field in Flash Address. This probably needs to
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008733 * be calculated here based off the on-chip erase sector size and
8734 * the software bank size (4, 8 or 64 KBytes) */
8735 flash_linear_address = bank * bank_size + j * sub_sector_size;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008736 flash_linear_address += hw->flash_base_addr;
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008737 flash_linear_address &= ICH_FLASH_LINEAR_ADDR_MASK;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008738
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008739 E1000_WRITE_ICH_FLASH_REG(hw, ICH_FLASH_FADDR, flash_linear_address);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008740
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008741 error = e1000_ich8_flash_cycle(hw, ICH_FLASH_ERASE_TIMEOUT);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008742 /* Check if FCERR is set to 1. If 1, clear it and try the whole
8743 * sequence a few more times else Done */
8744 if (error == E1000_SUCCESS) {
8745 break;
8746 } else {
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008747 hsfsts.regval = E1000_READ_ICH_FLASH_REG16(hw, ICH_FLASH_HSFSTS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008748 if (hsfsts.hsf_status.flcerr == 1) {
8749 /* repeat for some time before giving up */
8750 continue;
8751 } else if (hsfsts.hsf_status.flcdone == 0) {
8752 error_flag = 1;
8753 break;
8754 }
8755 }
Jeff Kirsher2df7d592006-11-01 08:48:02 -08008756 } while ((count < ICH_FLASH_CYCLE_REPEAT_COUNT) && !error_flag);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008757 if (error_flag == 1)
8758 break;
8759 }
8760 if (error_flag != 1)
8761 error = E1000_SUCCESS;
8762 return error;
8763}
8764
Joe Perches64798842008-07-11 15:17:02 -07008765static s32 e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
8766 u32 cnf_base_addr,
8767 u32 cnf_size)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008768{
Joe Perches406874a2008-04-03 10:06:32 -07008769 u32 ret_val = E1000_SUCCESS;
8770 u16 word_addr, reg_data, reg_addr;
8771 u16 i;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008772
8773 /* cnf_base_addr is in DWORD */
Joe Perches406874a2008-04-03 10:06:32 -07008774 word_addr = (u16)(cnf_base_addr << 1);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008775
8776 /* cnf_size is returned in size of dwords */
8777 for (i = 0; i < cnf_size; i++) {
8778 ret_val = e1000_read_eeprom(hw, (word_addr + i*2), 1, &reg_data);
8779 if (ret_val)
8780 return ret_val;
8781
8782 ret_val = e1000_read_eeprom(hw, (word_addr + i*2 + 1), 1, &reg_addr);
8783 if (ret_val)
8784 return ret_val;
8785
8786 ret_val = e1000_get_software_flag(hw);
8787 if (ret_val != E1000_SUCCESS)
8788 return ret_val;
8789
Joe Perches406874a2008-04-03 10:06:32 -07008790 ret_val = e1000_write_phy_reg_ex(hw, (u32)reg_addr, reg_data);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008791
8792 e1000_release_software_flag(hw);
8793 }
8794
8795 return ret_val;
8796}
8797
8798
Jeff Kirsher2a88c172006-09-27 12:54:05 -07008799/******************************************************************************
8800 * This function initializes the PHY from the NVM on ICH8 platforms. This
8801 * is needed due to an issue where the NVM configuration is not properly
8802 * autoloaded after power transitions. Therefore, after each PHY reset, we
8803 * will load the configuration data out of the NVM manually.
8804 *
8805 * hw: Struct containing variables accessed by shared code
8806 *****************************************************************************/
Joe Perches64798842008-07-11 15:17:02 -07008807static s32 e1000_init_lcd_from_nvm(struct e1000_hw *hw)
Auke Kokd37ea5d2006-06-27 09:08:17 -07008808{
Joe Perches406874a2008-04-03 10:06:32 -07008809 u32 reg_data, cnf_base_addr, cnf_size, ret_val, loop;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008810
8811 if (hw->phy_type != e1000_phy_igp_3)
8812 return E1000_SUCCESS;
8813
8814 /* Check if SW needs configure the PHY */
Joe Perches1dc32912008-07-11 15:17:08 -07008815 reg_data = er32(FEXTNVM);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008816 if (!(reg_data & FEXTNVM_SW_CONFIG))
8817 return E1000_SUCCESS;
8818
8819 /* Wait for basic configuration completes before proceeding*/
8820 loop = 0;
8821 do {
Joe Perches1dc32912008-07-11 15:17:08 -07008822 reg_data = er32(STATUS) & E1000_STATUS_LAN_INIT_DONE;
Auke Kokd37ea5d2006-06-27 09:08:17 -07008823 udelay(100);
8824 loop++;
8825 } while ((!reg_data) && (loop < 50));
8826
8827 /* Clear the Init Done bit for the next init event */
Joe Perches1dc32912008-07-11 15:17:08 -07008828 reg_data = er32(STATUS);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008829 reg_data &= ~E1000_STATUS_LAN_INIT_DONE;
Joe Perches1dc32912008-07-11 15:17:08 -07008830 ew32(STATUS, reg_data);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008831
8832 /* Make sure HW does not configure LCD from PHY extended configuration
8833 before SW configuration */
Joe Perches1dc32912008-07-11 15:17:08 -07008834 reg_data = er32(EXTCNF_CTRL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008835 if ((reg_data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) == 0x0000) {
Joe Perches1dc32912008-07-11 15:17:08 -07008836 reg_data = er32(EXTCNF_SIZE);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008837 cnf_size = reg_data & E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH;
8838 cnf_size >>= 16;
8839 if (cnf_size) {
Joe Perches1dc32912008-07-11 15:17:08 -07008840 reg_data = er32(EXTCNF_CTRL);
Auke Kokd37ea5d2006-06-27 09:08:17 -07008841 cnf_base_addr = reg_data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER;
8842 /* cnf_base_addr is in DWORD */
8843 cnf_base_addr >>= 16;
8844
8845 /* Configure LCD from extended configuration region. */
8846 ret_val = e1000_init_lcd_from_nvm_config_region(hw, cnf_base_addr,
8847 cnf_size);
8848 if (ret_val)
8849 return ret_val;
8850 }
8851 }
8852
8853 return E1000_SUCCESS;
8854}
8855