ixgbe_phy.c revision 1.2 1 1.1 dyoung /******************************************************************************
2 1.1 dyoung
3 1.1 dyoung Copyright (c) 2001-2010, Intel Corporation
4 1.1 dyoung All rights reserved.
5 1.1 dyoung
6 1.1 dyoung Redistribution and use in source and binary forms, with or without
7 1.1 dyoung modification, are permitted provided that the following conditions are met:
8 1.1 dyoung
9 1.1 dyoung 1. Redistributions of source code must retain the above copyright notice,
10 1.1 dyoung this list of conditions and the following disclaimer.
11 1.1 dyoung
12 1.1 dyoung 2. Redistributions in binary form must reproduce the above copyright
13 1.1 dyoung notice, this list of conditions and the following disclaimer in the
14 1.1 dyoung documentation and/or other materials provided with the distribution.
15 1.1 dyoung
16 1.1 dyoung 3. Neither the name of the Intel Corporation nor the names of its
17 1.1 dyoung contributors may be used to endorse or promote products derived from
18 1.1 dyoung this software without specific prior written permission.
19 1.1 dyoung
20 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 1.1 dyoung AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 1.1 dyoung IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 1.1 dyoung ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 1.1 dyoung LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 1.1 dyoung CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 1.1 dyoung SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 1.1 dyoung INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 1.1 dyoung CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 1.1 dyoung ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 1.1 dyoung POSSIBILITY OF SUCH DAMAGE.
31 1.1 dyoung
32 1.1 dyoung ******************************************************************************/
33 1.1 dyoung /*$FreeBSD: src/sys/dev/ixgbe/ixgbe_phy.c,v 1.11 2010/11/26 22:46:32 jfv Exp $*/
34 1.2 christos /*$NetBSD: ixgbe_phy.c,v 1.2 2014/04/17 15:35:49 christos Exp $*/
35 1.1 dyoung
36 1.1 dyoung #include "ixgbe_api.h"
37 1.1 dyoung #include "ixgbe_common.h"
38 1.1 dyoung #include "ixgbe_phy.h"
39 1.1 dyoung
40 1.1 dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw);
41 1.1 dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw);
42 1.1 dyoung static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data);
43 1.1 dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data);
44 1.1 dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw);
45 1.1 dyoung static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data);
46 1.1 dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data);
47 1.1 dyoung static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
48 1.1 dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
49 1.1 dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data);
50 1.1 dyoung static bool ixgbe_get_i2c_data(u32 *i2cctl);
51 1.1 dyoung void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw);
52 1.1 dyoung
53 1.1 dyoung /**
54 1.1 dyoung * ixgbe_init_phy_ops_generic - Inits PHY function ptrs
55 1.1 dyoung * @hw: pointer to the hardware structure
56 1.1 dyoung *
57 1.1 dyoung * Initialize the function pointers.
58 1.1 dyoung **/
59 1.1 dyoung s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
60 1.1 dyoung {
61 1.1 dyoung struct ixgbe_phy_info *phy = &hw->phy;
62 1.1 dyoung
63 1.1 dyoung DEBUGFUNC("ixgbe_init_phy_ops_generic");
64 1.1 dyoung
65 1.1 dyoung /* PHY */
66 1.1 dyoung phy->ops.identify = &ixgbe_identify_phy_generic;
67 1.1 dyoung phy->ops.reset = &ixgbe_reset_phy_generic;
68 1.1 dyoung phy->ops.read_reg = &ixgbe_read_phy_reg_generic;
69 1.1 dyoung phy->ops.write_reg = &ixgbe_write_phy_reg_generic;
70 1.1 dyoung phy->ops.setup_link = &ixgbe_setup_phy_link_generic;
71 1.1 dyoung phy->ops.setup_link_speed = &ixgbe_setup_phy_link_speed_generic;
72 1.1 dyoung phy->ops.check_link = NULL;
73 1.1 dyoung phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic;
74 1.1 dyoung phy->ops.read_i2c_byte = &ixgbe_read_i2c_byte_generic;
75 1.1 dyoung phy->ops.write_i2c_byte = &ixgbe_write_i2c_byte_generic;
76 1.1 dyoung phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic;
77 1.1 dyoung phy->ops.write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic;
78 1.1 dyoung phy->ops.i2c_bus_clear = &ixgbe_i2c_bus_clear;
79 1.1 dyoung phy->ops.identify_sfp = &ixgbe_identify_sfp_module_generic;
80 1.1 dyoung phy->sfp_type = ixgbe_sfp_type_unknown;
81 1.1 dyoung phy->ops.check_overtemp = &ixgbe_tn_check_overtemp;
82 1.1 dyoung return IXGBE_SUCCESS;
83 1.1 dyoung }
84 1.1 dyoung
85 1.1 dyoung /**
86 1.1 dyoung * ixgbe_identify_phy_generic - Get physical layer module
87 1.1 dyoung * @hw: pointer to hardware structure
88 1.1 dyoung *
89 1.1 dyoung * Determines the physical layer module found on the current adapter.
90 1.1 dyoung **/
91 1.1 dyoung s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
92 1.1 dyoung {
93 1.1 dyoung s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
94 1.1 dyoung u32 phy_addr;
95 1.1 dyoung u16 ext_ability = 0;
96 1.1 dyoung
97 1.1 dyoung DEBUGFUNC("ixgbe_identify_phy_generic");
98 1.1 dyoung
99 1.1 dyoung if (hw->phy.type == ixgbe_phy_unknown) {
100 1.1 dyoung for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
101 1.1 dyoung if (ixgbe_validate_phy_addr(hw, phy_addr)) {
102 1.1 dyoung hw->phy.addr = phy_addr;
103 1.1 dyoung ixgbe_get_phy_id(hw);
104 1.1 dyoung hw->phy.type =
105 1.1 dyoung ixgbe_get_phy_type_from_id(hw->phy.id);
106 1.1 dyoung
107 1.1 dyoung if (hw->phy.type == ixgbe_phy_unknown) {
108 1.1 dyoung hw->phy.ops.read_reg(hw,
109 1.1 dyoung IXGBE_MDIO_PHY_EXT_ABILITY,
110 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE,
111 1.1 dyoung &ext_ability);
112 1.1 dyoung if (ext_ability &
113 1.1 dyoung (IXGBE_MDIO_PHY_10GBASET_ABILITY |
114 1.1 dyoung IXGBE_MDIO_PHY_1000BASET_ABILITY))
115 1.1 dyoung hw->phy.type =
116 1.1 dyoung ixgbe_phy_cu_unknown;
117 1.1 dyoung else
118 1.1 dyoung hw->phy.type =
119 1.1 dyoung ixgbe_phy_generic;
120 1.1 dyoung }
121 1.1 dyoung
122 1.1 dyoung status = IXGBE_SUCCESS;
123 1.1 dyoung break;
124 1.1 dyoung }
125 1.1 dyoung }
126 1.1 dyoung /* clear value if nothing found */
127 1.1 dyoung if (status != IXGBE_SUCCESS)
128 1.1 dyoung hw->phy.addr = 0;
129 1.1 dyoung } else {
130 1.1 dyoung status = IXGBE_SUCCESS;
131 1.1 dyoung }
132 1.1 dyoung
133 1.1 dyoung return status;
134 1.1 dyoung }
135 1.1 dyoung
136 1.1 dyoung /**
137 1.1 dyoung * ixgbe_validate_phy_addr - Determines phy address is valid
138 1.1 dyoung * @hw: pointer to hardware structure
139 1.1 dyoung *
140 1.1 dyoung **/
141 1.1 dyoung bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr)
142 1.1 dyoung {
143 1.1 dyoung u16 phy_id = 0;
144 1.1 dyoung bool valid = FALSE;
145 1.1 dyoung
146 1.1 dyoung DEBUGFUNC("ixgbe_validate_phy_addr");
147 1.1 dyoung
148 1.1 dyoung hw->phy.addr = phy_addr;
149 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
150 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id);
151 1.1 dyoung
152 1.1 dyoung if (phy_id != 0xFFFF && phy_id != 0x0)
153 1.1 dyoung valid = TRUE;
154 1.1 dyoung
155 1.1 dyoung return valid;
156 1.1 dyoung }
157 1.1 dyoung
158 1.1 dyoung /**
159 1.1 dyoung * ixgbe_get_phy_id - Get the phy type
160 1.1 dyoung * @hw: pointer to hardware structure
161 1.1 dyoung *
162 1.1 dyoung **/
163 1.1 dyoung s32 ixgbe_get_phy_id(struct ixgbe_hw *hw)
164 1.1 dyoung {
165 1.1 dyoung u32 status;
166 1.1 dyoung u16 phy_id_high = 0;
167 1.1 dyoung u16 phy_id_low = 0;
168 1.1 dyoung
169 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_id");
170 1.1 dyoung
171 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
172 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE,
173 1.1 dyoung &phy_id_high);
174 1.1 dyoung
175 1.1 dyoung if (status == IXGBE_SUCCESS) {
176 1.1 dyoung hw->phy.id = (u32)(phy_id_high << 16);
177 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_LOW,
178 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE,
179 1.1 dyoung &phy_id_low);
180 1.1 dyoung hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK);
181 1.1 dyoung hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);
182 1.1 dyoung }
183 1.1 dyoung return status;
184 1.1 dyoung }
185 1.1 dyoung
186 1.1 dyoung /**
187 1.1 dyoung * ixgbe_get_phy_type_from_id - Get the phy type
188 1.1 dyoung * @hw: pointer to hardware structure
189 1.1 dyoung *
190 1.1 dyoung **/
191 1.1 dyoung enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
192 1.1 dyoung {
193 1.1 dyoung enum ixgbe_phy_type phy_type;
194 1.1 dyoung
195 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_type_from_id");
196 1.1 dyoung
197 1.1 dyoung switch (phy_id) {
198 1.1 dyoung case TN1010_PHY_ID:
199 1.1 dyoung phy_type = ixgbe_phy_tn;
200 1.1 dyoung break;
201 1.1 dyoung case AQ1002_PHY_ID:
202 1.1 dyoung phy_type = ixgbe_phy_aq;
203 1.1 dyoung break;
204 1.1 dyoung case QT2022_PHY_ID:
205 1.1 dyoung phy_type = ixgbe_phy_qt;
206 1.1 dyoung break;
207 1.1 dyoung case ATH_PHY_ID:
208 1.1 dyoung phy_type = ixgbe_phy_nl;
209 1.1 dyoung break;
210 1.1 dyoung default:
211 1.1 dyoung phy_type = ixgbe_phy_unknown;
212 1.1 dyoung break;
213 1.1 dyoung }
214 1.1 dyoung
215 1.1 dyoung DEBUGOUT1("phy type found is %d\n", phy_type);
216 1.1 dyoung return phy_type;
217 1.1 dyoung }
218 1.1 dyoung
219 1.1 dyoung /**
220 1.1 dyoung * ixgbe_reset_phy_generic - Performs a PHY reset
221 1.1 dyoung * @hw: pointer to hardware structure
222 1.1 dyoung **/
223 1.1 dyoung s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
224 1.1 dyoung {
225 1.1 dyoung u32 i;
226 1.1 dyoung u16 ctrl = 0;
227 1.1 dyoung s32 status = IXGBE_SUCCESS;
228 1.1 dyoung
229 1.1 dyoung DEBUGFUNC("ixgbe_reset_phy_generic");
230 1.1 dyoung
231 1.1 dyoung if (hw->phy.type == ixgbe_phy_unknown)
232 1.1 dyoung status = ixgbe_identify_phy_generic(hw);
233 1.1 dyoung
234 1.1 dyoung if (status != IXGBE_SUCCESS || hw->phy.type == ixgbe_phy_none)
235 1.1 dyoung goto out;
236 1.1 dyoung
237 1.1 dyoung /* Don't reset PHY if it's shut down due to overtemp. */
238 1.1 dyoung if (!hw->phy.reset_if_overtemp &&
239 1.1 dyoung (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
240 1.1 dyoung goto out;
241 1.1 dyoung
242 1.1 dyoung /*
243 1.1 dyoung * Perform soft PHY reset to the PHY_XS.
244 1.1 dyoung * This will cause a soft reset to the PHY
245 1.1 dyoung */
246 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
247 1.1 dyoung IXGBE_MDIO_PHY_XS_DEV_TYPE,
248 1.1 dyoung IXGBE_MDIO_PHY_XS_RESET);
249 1.1 dyoung
250 1.1 dyoung /*
251 1.1 dyoung * Poll for reset bit to self-clear indicating reset is complete.
252 1.1 dyoung * Some PHYs could take up to 3 seconds to complete and need about
253 1.1 dyoung * 1.7 usec delay after the reset is complete.
254 1.1 dyoung */
255 1.1 dyoung for (i = 0; i < 30; i++) {
256 1.1 dyoung msec_delay(100);
257 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
258 1.1 dyoung IXGBE_MDIO_PHY_XS_DEV_TYPE, &ctrl);
259 1.1 dyoung if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
260 1.1 dyoung usec_delay(2);
261 1.1 dyoung break;
262 1.1 dyoung }
263 1.1 dyoung }
264 1.1 dyoung
265 1.1 dyoung if (ctrl & IXGBE_MDIO_PHY_XS_RESET) {
266 1.1 dyoung status = IXGBE_ERR_RESET_FAILED;
267 1.1 dyoung DEBUGOUT("PHY reset polling failed to complete.\n");
268 1.1 dyoung }
269 1.1 dyoung
270 1.1 dyoung out:
271 1.1 dyoung return status;
272 1.1 dyoung }
273 1.1 dyoung
274 1.1 dyoung /**
275 1.1 dyoung * ixgbe_read_phy_reg_generic - Reads a value from a specified PHY register
276 1.1 dyoung * @hw: pointer to hardware structure
277 1.1 dyoung * @reg_addr: 32 bit address of PHY register to read
278 1.1 dyoung * @phy_data: Pointer to read data from PHY register
279 1.1 dyoung **/
280 1.1 dyoung s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
281 1.1 dyoung u32 device_type, u16 *phy_data)
282 1.1 dyoung {
283 1.1 dyoung u32 command;
284 1.1 dyoung u32 i;
285 1.1 dyoung u32 data;
286 1.1 dyoung s32 status = IXGBE_SUCCESS;
287 1.1 dyoung u16 gssr;
288 1.1 dyoung
289 1.1 dyoung DEBUGFUNC("ixgbe_read_phy_reg_generic");
290 1.1 dyoung
291 1.1 dyoung if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
292 1.1 dyoung gssr = IXGBE_GSSR_PHY1_SM;
293 1.1 dyoung else
294 1.1 dyoung gssr = IXGBE_GSSR_PHY0_SM;
295 1.1 dyoung
296 1.1 dyoung if (ixgbe_acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS)
297 1.1 dyoung status = IXGBE_ERR_SWFW_SYNC;
298 1.1 dyoung
299 1.1 dyoung if (status == IXGBE_SUCCESS) {
300 1.1 dyoung /* Setup and write the address cycle command */
301 1.1 dyoung command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
302 1.1 dyoung (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
303 1.1 dyoung (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
304 1.1 dyoung (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
305 1.1 dyoung
306 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
307 1.1 dyoung
308 1.1 dyoung /*
309 1.1 dyoung * Check every 10 usec to see if the address cycle completed.
310 1.1 dyoung * The MDI Command bit will clear when the operation is
311 1.1 dyoung * complete
312 1.1 dyoung */
313 1.1 dyoung for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
314 1.1 dyoung usec_delay(10);
315 1.1 dyoung
316 1.1 dyoung command = IXGBE_READ_REG(hw, IXGBE_MSCA);
317 1.1 dyoung
318 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
319 1.1 dyoung break;
320 1.1 dyoung }
321 1.1 dyoung
322 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
323 1.1 dyoung DEBUGOUT("PHY address command did not complete.\n");
324 1.1 dyoung status = IXGBE_ERR_PHY;
325 1.1 dyoung }
326 1.1 dyoung
327 1.1 dyoung if (status == IXGBE_SUCCESS) {
328 1.1 dyoung /*
329 1.1 dyoung * Address cycle complete, setup and write the read
330 1.1 dyoung * command
331 1.1 dyoung */
332 1.1 dyoung command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
333 1.1 dyoung (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
334 1.1 dyoung (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
335 1.1 dyoung (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND));
336 1.1 dyoung
337 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
338 1.1 dyoung
339 1.1 dyoung /*
340 1.1 dyoung * Check every 10 usec to see if the address cycle
341 1.1 dyoung * completed. The MDI Command bit will clear when the
342 1.1 dyoung * operation is complete
343 1.1 dyoung */
344 1.1 dyoung for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
345 1.1 dyoung usec_delay(10);
346 1.1 dyoung
347 1.1 dyoung command = IXGBE_READ_REG(hw, IXGBE_MSCA);
348 1.1 dyoung
349 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
350 1.1 dyoung break;
351 1.1 dyoung }
352 1.1 dyoung
353 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
354 1.1 dyoung DEBUGOUT("PHY read command didn't complete\n");
355 1.1 dyoung status = IXGBE_ERR_PHY;
356 1.1 dyoung } else {
357 1.1 dyoung /*
358 1.1 dyoung * Read operation is complete. Get the data
359 1.1 dyoung * from MSRWD
360 1.1 dyoung */
361 1.1 dyoung data = IXGBE_READ_REG(hw, IXGBE_MSRWD);
362 1.1 dyoung data >>= IXGBE_MSRWD_READ_DATA_SHIFT;
363 1.1 dyoung *phy_data = (u16)(data);
364 1.1 dyoung }
365 1.1 dyoung }
366 1.1 dyoung
367 1.1 dyoung ixgbe_release_swfw_sync(hw, gssr);
368 1.1 dyoung }
369 1.1 dyoung
370 1.1 dyoung return status;
371 1.1 dyoung }
372 1.1 dyoung
373 1.1 dyoung /**
374 1.1 dyoung * ixgbe_write_phy_reg_generic - Writes a value to specified PHY register
375 1.1 dyoung * @hw: pointer to hardware structure
376 1.1 dyoung * @reg_addr: 32 bit PHY register to write
377 1.1 dyoung * @device_type: 5 bit device type
378 1.1 dyoung * @phy_data: Data to write to the PHY register
379 1.1 dyoung **/
380 1.1 dyoung s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
381 1.1 dyoung u32 device_type, u16 phy_data)
382 1.1 dyoung {
383 1.1 dyoung u32 command;
384 1.1 dyoung u32 i;
385 1.1 dyoung s32 status = IXGBE_SUCCESS;
386 1.1 dyoung u16 gssr;
387 1.1 dyoung
388 1.1 dyoung DEBUGFUNC("ixgbe_write_phy_reg_generic");
389 1.1 dyoung
390 1.1 dyoung if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
391 1.1 dyoung gssr = IXGBE_GSSR_PHY1_SM;
392 1.1 dyoung else
393 1.1 dyoung gssr = IXGBE_GSSR_PHY0_SM;
394 1.1 dyoung
395 1.1 dyoung if (ixgbe_acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS)
396 1.1 dyoung status = IXGBE_ERR_SWFW_SYNC;
397 1.1 dyoung
398 1.1 dyoung if (status == IXGBE_SUCCESS) {
399 1.1 dyoung /* Put the data in the MDI single read and write data register*/
400 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);
401 1.1 dyoung
402 1.1 dyoung /* Setup and write the address cycle command */
403 1.1 dyoung command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
404 1.1 dyoung (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
405 1.1 dyoung (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
406 1.1 dyoung (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
407 1.1 dyoung
408 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
409 1.1 dyoung
410 1.1 dyoung /*
411 1.1 dyoung * Check every 10 usec to see if the address cycle completed.
412 1.1 dyoung * The MDI Command bit will clear when the operation is
413 1.1 dyoung * complete
414 1.1 dyoung */
415 1.1 dyoung for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
416 1.1 dyoung usec_delay(10);
417 1.1 dyoung
418 1.1 dyoung command = IXGBE_READ_REG(hw, IXGBE_MSCA);
419 1.1 dyoung
420 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
421 1.1 dyoung break;
422 1.1 dyoung }
423 1.1 dyoung
424 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
425 1.1 dyoung DEBUGOUT("PHY address cmd didn't complete\n");
426 1.1 dyoung status = IXGBE_ERR_PHY;
427 1.1 dyoung }
428 1.1 dyoung
429 1.1 dyoung if (status == IXGBE_SUCCESS) {
430 1.1 dyoung /*
431 1.1 dyoung * Address cycle complete, setup and write the write
432 1.1 dyoung * command
433 1.1 dyoung */
434 1.1 dyoung command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
435 1.1 dyoung (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
436 1.1 dyoung (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
437 1.1 dyoung (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND));
438 1.1 dyoung
439 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
440 1.1 dyoung
441 1.1 dyoung /*
442 1.1 dyoung * Check every 10 usec to see if the address cycle
443 1.1 dyoung * completed. The MDI Command bit will clear when the
444 1.1 dyoung * operation is complete
445 1.1 dyoung */
446 1.1 dyoung for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
447 1.1 dyoung usec_delay(10);
448 1.1 dyoung
449 1.1 dyoung command = IXGBE_READ_REG(hw, IXGBE_MSCA);
450 1.1 dyoung
451 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
452 1.1 dyoung break;
453 1.1 dyoung }
454 1.1 dyoung
455 1.1 dyoung if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
456 1.1 dyoung DEBUGOUT("PHY address cmd didn't complete\n");
457 1.1 dyoung status = IXGBE_ERR_PHY;
458 1.1 dyoung }
459 1.1 dyoung }
460 1.1 dyoung
461 1.1 dyoung ixgbe_release_swfw_sync(hw, gssr);
462 1.1 dyoung }
463 1.1 dyoung
464 1.1 dyoung return status;
465 1.1 dyoung }
466 1.1 dyoung
467 1.1 dyoung /**
468 1.1 dyoung * ixgbe_setup_phy_link_generic - Set and restart autoneg
469 1.1 dyoung * @hw: pointer to hardware structure
470 1.1 dyoung *
471 1.1 dyoung * Restart autonegotiation and PHY and waits for completion.
472 1.1 dyoung **/
473 1.1 dyoung s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
474 1.1 dyoung {
475 1.1 dyoung s32 status = IXGBE_SUCCESS;
476 1.1 dyoung u32 time_out;
477 1.1 dyoung u32 max_time_out = 10;
478 1.1 dyoung u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
479 1.1 dyoung bool autoneg = FALSE;
480 1.1 dyoung ixgbe_link_speed speed;
481 1.1 dyoung
482 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_generic");
483 1.1 dyoung
484 1.1 dyoung ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
485 1.1 dyoung
486 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
487 1.1 dyoung /* Set or unset auto-negotiation 10G advertisement */
488 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
489 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
490 1.1 dyoung &autoneg_reg);
491 1.1 dyoung
492 1.1 dyoung autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
493 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
494 1.1 dyoung autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
495 1.1 dyoung
496 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
497 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
498 1.1 dyoung autoneg_reg);
499 1.1 dyoung }
500 1.1 dyoung
501 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
502 1.1 dyoung /* Set or unset auto-negotiation 1G advertisement */
503 1.1 dyoung hw->phy.ops.read_reg(hw,
504 1.1 dyoung IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
505 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
506 1.1 dyoung &autoneg_reg);
507 1.1 dyoung
508 1.1 dyoung autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
509 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
510 1.1 dyoung autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
511 1.1 dyoung
512 1.1 dyoung hw->phy.ops.write_reg(hw,
513 1.1 dyoung IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
514 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
515 1.1 dyoung autoneg_reg);
516 1.1 dyoung }
517 1.1 dyoung
518 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL) {
519 1.1 dyoung /* Set or unset auto-negotiation 100M advertisement */
520 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
521 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
522 1.1 dyoung &autoneg_reg);
523 1.1 dyoung
524 1.1 dyoung autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
525 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
526 1.1 dyoung autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
527 1.1 dyoung
528 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
529 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
530 1.1 dyoung autoneg_reg);
531 1.1 dyoung }
532 1.1 dyoung
533 1.1 dyoung /* Restart PHY autonegotiation and wait for completion */
534 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
535 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
536 1.1 dyoung
537 1.1 dyoung autoneg_reg |= IXGBE_MII_RESTART;
538 1.1 dyoung
539 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
540 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
541 1.1 dyoung
542 1.1 dyoung /* Wait for autonegotiation to finish */
543 1.1 dyoung for (time_out = 0; time_out < max_time_out; time_out++) {
544 1.1 dyoung usec_delay(10);
545 1.1 dyoung /* Restart PHY autonegotiation and wait for completion */
546 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
547 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
548 1.1 dyoung &autoneg_reg);
549 1.1 dyoung
550 1.1 dyoung autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE;
551 1.1 dyoung if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) {
552 1.1 dyoung break;
553 1.1 dyoung }
554 1.1 dyoung }
555 1.1 dyoung
556 1.1 dyoung if (time_out == max_time_out) {
557 1.1 dyoung status = IXGBE_ERR_LINK_SETUP;
558 1.1 dyoung DEBUGOUT("ixgbe_setup_phy_link_generic: time out");
559 1.1 dyoung }
560 1.1 dyoung
561 1.1 dyoung return status;
562 1.1 dyoung }
563 1.1 dyoung
564 1.1 dyoung /**
565 1.1 dyoung * ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
566 1.1 dyoung * @hw: pointer to hardware structure
567 1.1 dyoung * @speed: new link speed
568 1.1 dyoung * @autoneg: TRUE if autonegotiation enabled
569 1.1 dyoung **/
570 1.1 dyoung s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
571 1.1 dyoung ixgbe_link_speed speed,
572 1.1 dyoung bool autoneg,
573 1.1 dyoung bool autoneg_wait_to_complete)
574 1.1 dyoung {
575 1.1 dyoung UNREFERENCED_PARAMETER(autoneg);
576 1.1 dyoung UNREFERENCED_PARAMETER(autoneg_wait_to_complete);
577 1.1 dyoung
578 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
579 1.1 dyoung
580 1.1 dyoung /*
581 1.1 dyoung * Clear autoneg_advertised and set new values based on input link
582 1.1 dyoung * speed.
583 1.1 dyoung */
584 1.1 dyoung hw->phy.autoneg_advertised = 0;
585 1.1 dyoung
586 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL)
587 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
588 1.1 dyoung
589 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL)
590 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
591 1.1 dyoung
592 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL)
593 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL;
594 1.1 dyoung
595 1.1 dyoung /* Setup link based on the new speed settings */
596 1.1 dyoung hw->phy.ops.setup_link(hw);
597 1.1 dyoung
598 1.1 dyoung return IXGBE_SUCCESS;
599 1.1 dyoung }
600 1.1 dyoung
601 1.1 dyoung /**
602 1.1 dyoung * ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
603 1.1 dyoung * @hw: pointer to hardware structure
604 1.1 dyoung * @speed: pointer to link speed
605 1.1 dyoung * @autoneg: boolean auto-negotiation value
606 1.1 dyoung *
607 1.1 dyoung * Determines the link capabilities by reading the AUTOC register.
608 1.1 dyoung **/
609 1.1 dyoung s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
610 1.1 dyoung ixgbe_link_speed *speed,
611 1.1 dyoung bool *autoneg)
612 1.1 dyoung {
613 1.1 dyoung s32 status = IXGBE_ERR_LINK_SETUP;
614 1.1 dyoung u16 speed_ability;
615 1.1 dyoung
616 1.1 dyoung DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic");
617 1.1 dyoung
618 1.1 dyoung *speed = 0;
619 1.1 dyoung *autoneg = TRUE;
620 1.1 dyoung
621 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY,
622 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE,
623 1.1 dyoung &speed_ability);
624 1.1 dyoung
625 1.1 dyoung if (status == IXGBE_SUCCESS) {
626 1.1 dyoung if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G)
627 1.1 dyoung *speed |= IXGBE_LINK_SPEED_10GB_FULL;
628 1.1 dyoung if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G)
629 1.1 dyoung *speed |= IXGBE_LINK_SPEED_1GB_FULL;
630 1.1 dyoung if (speed_ability & IXGBE_MDIO_PHY_SPEED_100M)
631 1.1 dyoung *speed |= IXGBE_LINK_SPEED_100_FULL;
632 1.1 dyoung }
633 1.1 dyoung
634 1.1 dyoung return status;
635 1.1 dyoung }
636 1.1 dyoung
637 1.1 dyoung /**
638 1.1 dyoung * ixgbe_check_phy_link_tnx - Determine link and speed status
639 1.1 dyoung * @hw: pointer to hardware structure
640 1.1 dyoung *
641 1.1 dyoung * Reads the VS1 register to determine if link is up and the current speed for
642 1.1 dyoung * the PHY.
643 1.1 dyoung **/
644 1.1 dyoung s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
645 1.1 dyoung bool *link_up)
646 1.1 dyoung {
647 1.1 dyoung s32 status = IXGBE_SUCCESS;
648 1.1 dyoung u32 time_out;
649 1.1 dyoung u32 max_time_out = 10;
650 1.1 dyoung u16 phy_link = 0;
651 1.1 dyoung u16 phy_speed = 0;
652 1.1 dyoung u16 phy_data = 0;
653 1.1 dyoung
654 1.1 dyoung DEBUGFUNC("ixgbe_check_phy_link_tnx");
655 1.1 dyoung
656 1.1 dyoung /* Initialize speed and link to default case */
657 1.1 dyoung *link_up = FALSE;
658 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL;
659 1.1 dyoung
660 1.1 dyoung /*
661 1.1 dyoung * Check current speed and link status of the PHY register.
662 1.1 dyoung * This is a vendor specific register and may have to
663 1.1 dyoung * be changed for other copper PHYs.
664 1.1 dyoung */
665 1.1 dyoung for (time_out = 0; time_out < max_time_out; time_out++) {
666 1.1 dyoung usec_delay(10);
667 1.1 dyoung status = hw->phy.ops.read_reg(hw,
668 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,
669 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
670 1.1 dyoung &phy_data);
671 1.1 dyoung phy_link = phy_data &
672 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;
673 1.1 dyoung phy_speed = phy_data &
674 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;
675 1.1 dyoung if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {
676 1.1 dyoung *link_up = TRUE;
677 1.1 dyoung if (phy_speed ==
678 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)
679 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL;
680 1.1 dyoung break;
681 1.1 dyoung }
682 1.1 dyoung }
683 1.1 dyoung
684 1.1 dyoung return status;
685 1.1 dyoung }
686 1.1 dyoung
687 1.1 dyoung /**
688 1.1 dyoung * ixgbe_setup_phy_link_tnx - Set and restart autoneg
689 1.1 dyoung * @hw: pointer to hardware structure
690 1.1 dyoung *
691 1.1 dyoung * Restart autonegotiation and PHY and waits for completion.
692 1.1 dyoung **/
693 1.1 dyoung s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
694 1.1 dyoung {
695 1.1 dyoung s32 status = IXGBE_SUCCESS;
696 1.1 dyoung u32 time_out;
697 1.1 dyoung u32 max_time_out = 10;
698 1.1 dyoung u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
699 1.1 dyoung bool autoneg = FALSE;
700 1.1 dyoung ixgbe_link_speed speed;
701 1.1 dyoung
702 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_tnx");
703 1.1 dyoung
704 1.1 dyoung ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
705 1.1 dyoung
706 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
707 1.1 dyoung /* Set or unset auto-negotiation 10G advertisement */
708 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
709 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
710 1.1 dyoung &autoneg_reg);
711 1.1 dyoung
712 1.1 dyoung autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
713 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
714 1.1 dyoung autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
715 1.1 dyoung
716 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
717 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
718 1.1 dyoung autoneg_reg);
719 1.1 dyoung }
720 1.1 dyoung
721 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
722 1.1 dyoung /* Set or unset auto-negotiation 1G advertisement */
723 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
724 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
725 1.1 dyoung &autoneg_reg);
726 1.1 dyoung
727 1.1 dyoung autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
728 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
729 1.1 dyoung autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
730 1.1 dyoung
731 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
732 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
733 1.1 dyoung autoneg_reg);
734 1.1 dyoung }
735 1.1 dyoung
736 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL) {
737 1.1 dyoung /* Set or unset auto-negotiation 100M advertisement */
738 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
739 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
740 1.1 dyoung &autoneg_reg);
741 1.1 dyoung
742 1.1 dyoung autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
743 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
744 1.1 dyoung autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
745 1.1 dyoung
746 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
747 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
748 1.1 dyoung autoneg_reg);
749 1.1 dyoung }
750 1.1 dyoung
751 1.1 dyoung /* Restart PHY autonegotiation and wait for completion */
752 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
753 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
754 1.1 dyoung
755 1.1 dyoung autoneg_reg |= IXGBE_MII_RESTART;
756 1.1 dyoung
757 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
758 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
759 1.1 dyoung
760 1.1 dyoung /* Wait for autonegotiation to finish */
761 1.1 dyoung for (time_out = 0; time_out < max_time_out; time_out++) {
762 1.1 dyoung usec_delay(10);
763 1.1 dyoung /* Restart PHY autonegotiation and wait for completion */
764 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
765 1.1 dyoung IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
766 1.1 dyoung &autoneg_reg);
767 1.1 dyoung
768 1.1 dyoung autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE;
769 1.1 dyoung if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) {
770 1.1 dyoung break;
771 1.1 dyoung }
772 1.1 dyoung }
773 1.1 dyoung
774 1.1 dyoung if (time_out == max_time_out) {
775 1.1 dyoung status = IXGBE_ERR_LINK_SETUP;
776 1.1 dyoung DEBUGOUT("ixgbe_setup_phy_link_tnx: time out");
777 1.1 dyoung }
778 1.1 dyoung
779 1.1 dyoung return status;
780 1.1 dyoung }
781 1.1 dyoung
782 1.1 dyoung /**
783 1.1 dyoung * ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
784 1.1 dyoung * @hw: pointer to hardware structure
785 1.1 dyoung * @firmware_version: pointer to the PHY Firmware Version
786 1.1 dyoung **/
787 1.1 dyoung s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
788 1.1 dyoung u16 *firmware_version)
789 1.1 dyoung {
790 1.1 dyoung s32 status = IXGBE_SUCCESS;
791 1.1 dyoung
792 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx");
793 1.1 dyoung
794 1.1 dyoung status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
795 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
796 1.1 dyoung firmware_version);
797 1.1 dyoung
798 1.1 dyoung return status;
799 1.1 dyoung }
800 1.1 dyoung
801 1.1 dyoung /**
802 1.1 dyoung * ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version
803 1.1 dyoung * @hw: pointer to hardware structure
804 1.1 dyoung * @firmware_version: pointer to the PHY Firmware Version
805 1.1 dyoung **/
806 1.1 dyoung s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
807 1.1 dyoung u16 *firmware_version)
808 1.1 dyoung {
809 1.1 dyoung s32 status = IXGBE_SUCCESS;
810 1.1 dyoung
811 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_firmware_version_generic");
812 1.1 dyoung
813 1.1 dyoung status = hw->phy.ops.read_reg(hw, AQ_FW_REV,
814 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
815 1.1 dyoung firmware_version);
816 1.1 dyoung
817 1.1 dyoung return status;
818 1.1 dyoung }
819 1.1 dyoung
820 1.1 dyoung /**
821 1.1 dyoung * ixgbe_reset_phy_nl - Performs a PHY reset
822 1.1 dyoung * @hw: pointer to hardware structure
823 1.1 dyoung **/
824 1.1 dyoung s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
825 1.1 dyoung {
826 1.1 dyoung u16 phy_offset, control, eword, edata, block_crc;
827 1.1 dyoung bool end_data = FALSE;
828 1.1 dyoung u16 list_offset, data_offset;
829 1.1 dyoung u16 phy_data = 0;
830 1.1 dyoung s32 ret_val = IXGBE_SUCCESS;
831 1.1 dyoung u32 i;
832 1.1 dyoung
833 1.1 dyoung DEBUGFUNC("ixgbe_reset_phy_nl");
834 1.1 dyoung
835 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
836 1.1 dyoung IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
837 1.1 dyoung
838 1.1 dyoung /* reset the PHY and poll for completion */
839 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
840 1.1 dyoung IXGBE_MDIO_PHY_XS_DEV_TYPE,
841 1.1 dyoung (phy_data | IXGBE_MDIO_PHY_XS_RESET));
842 1.1 dyoung
843 1.1 dyoung for (i = 0; i < 100; i++) {
844 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
845 1.1 dyoung IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
846 1.1 dyoung if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0)
847 1.1 dyoung break;
848 1.1 dyoung msec_delay(10);
849 1.1 dyoung }
850 1.1 dyoung
851 1.1 dyoung if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) {
852 1.1 dyoung DEBUGOUT("PHY reset did not complete.\n");
853 1.1 dyoung ret_val = IXGBE_ERR_PHY;
854 1.1 dyoung goto out;
855 1.1 dyoung }
856 1.1 dyoung
857 1.1 dyoung /* Get init offsets */
858 1.1 dyoung ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
859 1.1 dyoung &data_offset);
860 1.1 dyoung if (ret_val != IXGBE_SUCCESS)
861 1.1 dyoung goto out;
862 1.1 dyoung
863 1.1 dyoung ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc);
864 1.1 dyoung data_offset++;
865 1.1 dyoung while (!end_data) {
866 1.1 dyoung /*
867 1.1 dyoung * Read control word from PHY init contents offset
868 1.1 dyoung */
869 1.1 dyoung ret_val = hw->eeprom.ops.read(hw, data_offset, &eword);
870 1.1 dyoung control = (eword & IXGBE_CONTROL_MASK_NL) >>
871 1.1 dyoung IXGBE_CONTROL_SHIFT_NL;
872 1.1 dyoung edata = eword & IXGBE_DATA_MASK_NL;
873 1.1 dyoung switch (control) {
874 1.1 dyoung case IXGBE_DELAY_NL:
875 1.1 dyoung data_offset++;
876 1.1 dyoung DEBUGOUT1("DELAY: %d MS\n", edata);
877 1.1 dyoung msec_delay(edata);
878 1.1 dyoung break;
879 1.1 dyoung case IXGBE_DATA_NL:
880 1.1 dyoung DEBUGOUT("DATA: \n");
881 1.1 dyoung data_offset++;
882 1.1 dyoung hw->eeprom.ops.read(hw, data_offset++,
883 1.1 dyoung &phy_offset);
884 1.1 dyoung for (i = 0; i < edata; i++) {
885 1.1 dyoung hw->eeprom.ops.read(hw, data_offset, &eword);
886 1.1 dyoung hw->phy.ops.write_reg(hw, phy_offset,
887 1.1 dyoung IXGBE_TWINAX_DEV, eword);
888 1.1 dyoung DEBUGOUT2("Wrote %4.4x to %4.4x\n", eword,
889 1.1 dyoung phy_offset);
890 1.1 dyoung data_offset++;
891 1.1 dyoung phy_offset++;
892 1.1 dyoung }
893 1.1 dyoung break;
894 1.1 dyoung case IXGBE_CONTROL_NL:
895 1.1 dyoung data_offset++;
896 1.1 dyoung DEBUGOUT("CONTROL: \n");
897 1.1 dyoung if (edata == IXGBE_CONTROL_EOL_NL) {
898 1.1 dyoung DEBUGOUT("EOL\n");
899 1.1 dyoung end_data = TRUE;
900 1.1 dyoung } else if (edata == IXGBE_CONTROL_SOL_NL) {
901 1.1 dyoung DEBUGOUT("SOL\n");
902 1.1 dyoung } else {
903 1.1 dyoung DEBUGOUT("Bad control value\n");
904 1.1 dyoung ret_val = IXGBE_ERR_PHY;
905 1.1 dyoung goto out;
906 1.1 dyoung }
907 1.1 dyoung break;
908 1.1 dyoung default:
909 1.1 dyoung DEBUGOUT("Bad control type\n");
910 1.1 dyoung ret_val = IXGBE_ERR_PHY;
911 1.1 dyoung goto out;
912 1.1 dyoung }
913 1.1 dyoung }
914 1.1 dyoung
915 1.1 dyoung out:
916 1.1 dyoung return ret_val;
917 1.1 dyoung }
918 1.1 dyoung
919 1.1 dyoung /**
920 1.1 dyoung * ixgbe_identify_sfp_module_generic - Identifies SFP modules
921 1.1 dyoung * @hw: pointer to hardware structure
922 1.1 dyoung *
923 1.1 dyoung * Searches for and identifies the SFP module and assigns appropriate PHY type.
924 1.1 dyoung **/
925 1.1 dyoung s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
926 1.1 dyoung {
927 1.1 dyoung s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
928 1.1 dyoung u32 vendor_oui = 0;
929 1.1 dyoung enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
930 1.1 dyoung u8 identifier = 0;
931 1.1 dyoung u8 comp_codes_1g = 0;
932 1.1 dyoung u8 comp_codes_10g = 0;
933 1.1 dyoung u8 oui_bytes[3] = {0, 0, 0};
934 1.1 dyoung u8 cable_tech = 0;
935 1.1 dyoung u8 cable_spec = 0;
936 1.1 dyoung u16 enforce_sfp = 0;
937 1.1 dyoung
938 1.1 dyoung DEBUGFUNC("ixgbe_identify_sfp_module_generic");
939 1.1 dyoung
940 1.1 dyoung if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
941 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_not_present;
942 1.1 dyoung status = IXGBE_ERR_SFP_NOT_PRESENT;
943 1.1 dyoung goto out;
944 1.1 dyoung }
945 1.1 dyoung
946 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
947 1.1 dyoung IXGBE_SFF_IDENTIFIER,
948 1.1 dyoung &identifier);
949 1.1 dyoung
950 1.1 dyoung if (status == IXGBE_ERR_SWFW_SYNC ||
951 1.1 dyoung status == IXGBE_ERR_I2C ||
952 1.1 dyoung status == IXGBE_ERR_SFP_NOT_PRESENT)
953 1.1 dyoung goto err_read_i2c_eeprom;
954 1.1 dyoung
955 1.1 dyoung /* LAN ID is needed for sfp_type determination */
956 1.1 dyoung hw->mac.ops.set_lan_id(hw);
957 1.1 dyoung
958 1.1 dyoung if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
959 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_unsupported;
960 1.1 dyoung status = IXGBE_ERR_SFP_NOT_SUPPORTED;
961 1.1 dyoung } else {
962 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
963 1.1 dyoung IXGBE_SFF_1GBE_COMP_CODES,
964 1.1 dyoung &comp_codes_1g);
965 1.1 dyoung
966 1.1 dyoung if (status == IXGBE_ERR_SWFW_SYNC ||
967 1.1 dyoung status == IXGBE_ERR_I2C ||
968 1.1 dyoung status == IXGBE_ERR_SFP_NOT_PRESENT)
969 1.1 dyoung goto err_read_i2c_eeprom;
970 1.1 dyoung
971 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
972 1.1 dyoung IXGBE_SFF_10GBE_COMP_CODES,
973 1.1 dyoung &comp_codes_10g);
974 1.1 dyoung
975 1.1 dyoung if (status == IXGBE_ERR_SWFW_SYNC ||
976 1.1 dyoung status == IXGBE_ERR_I2C ||
977 1.1 dyoung status == IXGBE_ERR_SFP_NOT_PRESENT)
978 1.1 dyoung goto err_read_i2c_eeprom;
979 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
980 1.1 dyoung IXGBE_SFF_CABLE_TECHNOLOGY,
981 1.1 dyoung &cable_tech);
982 1.1 dyoung
983 1.1 dyoung if (status == IXGBE_ERR_SWFW_SYNC ||
984 1.1 dyoung status == IXGBE_ERR_I2C ||
985 1.1 dyoung status == IXGBE_ERR_SFP_NOT_PRESENT)
986 1.1 dyoung goto err_read_i2c_eeprom;
987 1.1 dyoung
988 1.1 dyoung /* ID Module
989 1.1 dyoung * =========
990 1.1 dyoung * 0 SFP_DA_CU
991 1.1 dyoung * 1 SFP_SR
992 1.1 dyoung * 2 SFP_LR
993 1.1 dyoung * 3 SFP_DA_CORE0 - 82599-specific
994 1.1 dyoung * 4 SFP_DA_CORE1 - 82599-specific
995 1.1 dyoung * 5 SFP_SR/LR_CORE0 - 82599-specific
996 1.1 dyoung * 6 SFP_SR/LR_CORE1 - 82599-specific
997 1.1 dyoung * 7 SFP_act_lmt_DA_CORE0 - 82599-specific
998 1.1 dyoung * 8 SFP_act_lmt_DA_CORE1 - 82599-specific
999 1.1 dyoung * 9 SFP_1g_cu_CORE0 - 82599-specific
1000 1.1 dyoung * 10 SFP_1g_cu_CORE1 - 82599-specific
1001 1.1 dyoung */
1002 1.1 dyoung if (hw->mac.type == ixgbe_mac_82598EB) {
1003 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1004 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
1005 1.1 dyoung else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
1006 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_sr;
1007 1.1 dyoung else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
1008 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_lr;
1009 1.1 dyoung else
1010 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_unknown;
1011 1.1 dyoung } else if (hw->mac.type == ixgbe_mac_82599EB) {
1012 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
1013 1.1 dyoung if (hw->bus.lan_id == 0)
1014 1.1 dyoung hw->phy.sfp_type =
1015 1.1 dyoung ixgbe_sfp_type_da_cu_core0;
1016 1.1 dyoung else
1017 1.1 dyoung hw->phy.sfp_type =
1018 1.1 dyoung ixgbe_sfp_type_da_cu_core1;
1019 1.1 dyoung } else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
1020 1.1 dyoung hw->phy.ops.read_i2c_eeprom(
1021 1.1 dyoung hw, IXGBE_SFF_CABLE_SPEC_COMP,
1022 1.1 dyoung &cable_spec);
1023 1.1 dyoung if (cable_spec &
1024 1.1 dyoung IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
1025 1.1 dyoung if (hw->bus.lan_id == 0)
1026 1.1 dyoung hw->phy.sfp_type =
1027 1.1 dyoung ixgbe_sfp_type_da_act_lmt_core0;
1028 1.1 dyoung else
1029 1.1 dyoung hw->phy.sfp_type =
1030 1.1 dyoung ixgbe_sfp_type_da_act_lmt_core1;
1031 1.1 dyoung } else {
1032 1.1 dyoung hw->phy.sfp_type =
1033 1.1 dyoung ixgbe_sfp_type_unknown;
1034 1.1 dyoung }
1035 1.1 dyoung } else if (comp_codes_10g &
1036 1.1 dyoung (IXGBE_SFF_10GBASESR_CAPABLE |
1037 1.1 dyoung IXGBE_SFF_10GBASELR_CAPABLE)) {
1038 1.1 dyoung if (hw->bus.lan_id == 0)
1039 1.1 dyoung hw->phy.sfp_type =
1040 1.1 dyoung ixgbe_sfp_type_srlr_core0;
1041 1.1 dyoung else
1042 1.1 dyoung hw->phy.sfp_type =
1043 1.1 dyoung ixgbe_sfp_type_srlr_core1;
1044 1.1 dyoung } else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
1045 1.1 dyoung if (hw->bus.lan_id == 0)
1046 1.1 dyoung hw->phy.sfp_type =
1047 1.1 dyoung ixgbe_sfp_type_1g_cu_core0;
1048 1.1 dyoung else
1049 1.1 dyoung hw->phy.sfp_type =
1050 1.1 dyoung ixgbe_sfp_type_1g_cu_core1;
1051 1.1 dyoung } else {
1052 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_unknown;
1053 1.1 dyoung }
1054 1.1 dyoung }
1055 1.1 dyoung
1056 1.1 dyoung if (hw->phy.sfp_type != stored_sfp_type)
1057 1.1 dyoung hw->phy.sfp_setup_needed = TRUE;
1058 1.1 dyoung
1059 1.1 dyoung /* Determine if the SFP+ PHY is dual speed or not. */
1060 1.1 dyoung hw->phy.multispeed_fiber = FALSE;
1061 1.1 dyoung if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
1062 1.1 dyoung (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
1063 1.1 dyoung ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
1064 1.1 dyoung (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
1065 1.1 dyoung hw->phy.multispeed_fiber = TRUE;
1066 1.1 dyoung
1067 1.1 dyoung /* Determine PHY vendor */
1068 1.1 dyoung if (hw->phy.type != ixgbe_phy_nl) {
1069 1.1 dyoung hw->phy.id = identifier;
1070 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1071 1.1 dyoung IXGBE_SFF_VENDOR_OUI_BYTE0,
1072 1.1 dyoung &oui_bytes[0]);
1073 1.1 dyoung
1074 1.1 dyoung if (status == IXGBE_ERR_SWFW_SYNC ||
1075 1.1 dyoung status == IXGBE_ERR_I2C ||
1076 1.1 dyoung status == IXGBE_ERR_SFP_NOT_PRESENT)
1077 1.1 dyoung goto err_read_i2c_eeprom;
1078 1.1 dyoung
1079 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1080 1.1 dyoung IXGBE_SFF_VENDOR_OUI_BYTE1,
1081 1.1 dyoung &oui_bytes[1]);
1082 1.1 dyoung
1083 1.1 dyoung if (status == IXGBE_ERR_SWFW_SYNC ||
1084 1.1 dyoung status == IXGBE_ERR_I2C ||
1085 1.1 dyoung status == IXGBE_ERR_SFP_NOT_PRESENT)
1086 1.1 dyoung goto err_read_i2c_eeprom;
1087 1.1 dyoung
1088 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1089 1.1 dyoung IXGBE_SFF_VENDOR_OUI_BYTE2,
1090 1.1 dyoung &oui_bytes[2]);
1091 1.1 dyoung
1092 1.1 dyoung if (status == IXGBE_ERR_SWFW_SYNC ||
1093 1.1 dyoung status == IXGBE_ERR_I2C ||
1094 1.1 dyoung status == IXGBE_ERR_SFP_NOT_PRESENT)
1095 1.1 dyoung goto err_read_i2c_eeprom;
1096 1.1 dyoung
1097 1.1 dyoung vendor_oui =
1098 1.1 dyoung ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
1099 1.1 dyoung (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
1100 1.1 dyoung (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
1101 1.1 dyoung
1102 1.1 dyoung switch (vendor_oui) {
1103 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_TYCO:
1104 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1105 1.1 dyoung hw->phy.type =
1106 1.1 dyoung ixgbe_phy_sfp_passive_tyco;
1107 1.1 dyoung break;
1108 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_FTL:
1109 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
1110 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_ftl_active;
1111 1.1 dyoung else
1112 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_ftl;
1113 1.1 dyoung break;
1114 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_AVAGO:
1115 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_avago;
1116 1.1 dyoung break;
1117 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_INTEL:
1118 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_intel;
1119 1.1 dyoung break;
1120 1.1 dyoung default:
1121 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1122 1.1 dyoung hw->phy.type =
1123 1.1 dyoung ixgbe_phy_sfp_passive_unknown;
1124 1.1 dyoung else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
1125 1.1 dyoung hw->phy.type =
1126 1.1 dyoung ixgbe_phy_sfp_active_unknown;
1127 1.1 dyoung else
1128 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_unknown;
1129 1.1 dyoung break;
1130 1.1 dyoung }
1131 1.1 dyoung }
1132 1.1 dyoung
1133 1.1 dyoung /* Allow any DA cable vendor */
1134 1.1 dyoung if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
1135 1.1 dyoung IXGBE_SFF_DA_ACTIVE_CABLE)) {
1136 1.1 dyoung status = IXGBE_SUCCESS;
1137 1.1 dyoung goto out;
1138 1.1 dyoung }
1139 1.1 dyoung
1140 1.1 dyoung /* Verify supported 1G SFP modules */
1141 1.1 dyoung if (comp_codes_10g == 0 &&
1142 1.1 dyoung !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
1143 1.1 dyoung hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0)) {
1144 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_unsupported;
1145 1.1 dyoung status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1146 1.1 dyoung goto out;
1147 1.1 dyoung }
1148 1.1 dyoung
1149 1.1 dyoung /* Anything else 82598-based is supported */
1150 1.1 dyoung if (hw->mac.type == ixgbe_mac_82598EB) {
1151 1.1 dyoung status = IXGBE_SUCCESS;
1152 1.1 dyoung goto out;
1153 1.1 dyoung }
1154 1.1 dyoung
1155 1.1 dyoung ixgbe_get_device_caps(hw, &enforce_sfp);
1156 1.1 dyoung if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
1157 1.1 dyoung !((hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0) ||
1158 1.1 dyoung (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1))) {
1159 1.1 dyoung /* Make sure we're a supported PHY type */
1160 1.1 dyoung if (hw->phy.type == ixgbe_phy_sfp_intel) {
1161 1.1 dyoung status = IXGBE_SUCCESS;
1162 1.1 dyoung } else {
1163 1.1 dyoung DEBUGOUT("SFP+ module not supported\n");
1164 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_unsupported;
1165 1.1 dyoung status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1166 1.1 dyoung }
1167 1.1 dyoung } else {
1168 1.1 dyoung status = IXGBE_SUCCESS;
1169 1.1 dyoung }
1170 1.1 dyoung }
1171 1.1 dyoung
1172 1.1 dyoung out:
1173 1.1 dyoung return status;
1174 1.1 dyoung
1175 1.1 dyoung err_read_i2c_eeprom:
1176 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1177 1.1 dyoung if (hw->phy.type != ixgbe_phy_nl) {
1178 1.1 dyoung hw->phy.id = 0;
1179 1.1 dyoung hw->phy.type = ixgbe_phy_unknown;
1180 1.1 dyoung }
1181 1.1 dyoung return IXGBE_ERR_SFP_NOT_PRESENT;
1182 1.1 dyoung }
1183 1.1 dyoung
1184 1.1 dyoung /**
1185 1.1 dyoung * ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
1186 1.1 dyoung * @hw: pointer to hardware structure
1187 1.1 dyoung * @list_offset: offset to the SFP ID list
1188 1.1 dyoung * @data_offset: offset to the SFP data block
1189 1.1 dyoung *
1190 1.1 dyoung * Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
1191 1.1 dyoung * so it returns the offsets to the phy init sequence block.
1192 1.1 dyoung **/
1193 1.1 dyoung s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
1194 1.1 dyoung u16 *list_offset,
1195 1.1 dyoung u16 *data_offset)
1196 1.1 dyoung {
1197 1.1 dyoung u16 sfp_id;
1198 1.1 dyoung u16 sfp_type = hw->phy.sfp_type;
1199 1.1 dyoung
1200 1.1 dyoung DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets");
1201 1.1 dyoung
1202 1.1 dyoung if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
1203 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1204 1.1 dyoung
1205 1.1 dyoung if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
1206 1.1 dyoung return IXGBE_ERR_SFP_NOT_PRESENT;
1207 1.1 dyoung
1208 1.1 dyoung if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
1209 1.1 dyoung (hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
1210 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1211 1.1 dyoung
1212 1.1 dyoung /*
1213 1.1 dyoung * Limiting active cables and 1G Phys must be initialized as
1214 1.1 dyoung * SR modules
1215 1.1 dyoung */
1216 1.1 dyoung if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
1217 1.1 dyoung sfp_type == ixgbe_sfp_type_1g_cu_core0)
1218 1.1 dyoung sfp_type = ixgbe_sfp_type_srlr_core0;
1219 1.1 dyoung else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
1220 1.1 dyoung sfp_type == ixgbe_sfp_type_1g_cu_core1)
1221 1.1 dyoung sfp_type = ixgbe_sfp_type_srlr_core1;
1222 1.1 dyoung
1223 1.1 dyoung /* Read offset to PHY init contents */
1224 1.1 dyoung hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset);
1225 1.1 dyoung
1226 1.1 dyoung if ((!*list_offset) || (*list_offset == 0xFFFF))
1227 1.1 dyoung return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
1228 1.1 dyoung
1229 1.1 dyoung /* Shift offset to first ID word */
1230 1.1 dyoung (*list_offset)++;
1231 1.1 dyoung
1232 1.1 dyoung /*
1233 1.1 dyoung * Find the matching SFP ID in the EEPROM
1234 1.1 dyoung * and program the init sequence
1235 1.1 dyoung */
1236 1.1 dyoung hw->eeprom.ops.read(hw, *list_offset, &sfp_id);
1237 1.1 dyoung
1238 1.1 dyoung while (sfp_id != IXGBE_PHY_INIT_END_NL) {
1239 1.1 dyoung if (sfp_id == sfp_type) {
1240 1.1 dyoung (*list_offset)++;
1241 1.1 dyoung hw->eeprom.ops.read(hw, *list_offset, data_offset);
1242 1.1 dyoung if ((!*data_offset) || (*data_offset == 0xFFFF)) {
1243 1.1 dyoung DEBUGOUT("SFP+ module not supported\n");
1244 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1245 1.1 dyoung } else {
1246 1.1 dyoung break;
1247 1.1 dyoung }
1248 1.1 dyoung } else {
1249 1.1 dyoung (*list_offset) += 2;
1250 1.1 dyoung if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
1251 1.1 dyoung return IXGBE_ERR_PHY;
1252 1.1 dyoung }
1253 1.1 dyoung }
1254 1.1 dyoung
1255 1.1 dyoung if (sfp_id == IXGBE_PHY_INIT_END_NL) {
1256 1.1 dyoung DEBUGOUT("No matching SFP+ module found\n");
1257 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1258 1.1 dyoung }
1259 1.1 dyoung
1260 1.1 dyoung return IXGBE_SUCCESS;
1261 1.1 dyoung }
1262 1.1 dyoung
1263 1.1 dyoung /**
1264 1.1 dyoung * ixgbe_read_i2c_eeprom_generic - Reads 8 bit EEPROM word over I2C interface
1265 1.1 dyoung * @hw: pointer to hardware structure
1266 1.1 dyoung * @byte_offset: EEPROM byte offset to read
1267 1.1 dyoung * @eeprom_data: value read
1268 1.1 dyoung *
1269 1.1 dyoung * Performs byte read operation to SFP module's EEPROM over I2C interface.
1270 1.1 dyoung **/
1271 1.1 dyoung s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
1272 1.1 dyoung u8 *eeprom_data)
1273 1.1 dyoung {
1274 1.1 dyoung DEBUGFUNC("ixgbe_read_i2c_eeprom_generic");
1275 1.1 dyoung
1276 1.1 dyoung return hw->phy.ops.read_i2c_byte(hw, byte_offset,
1277 1.1 dyoung IXGBE_I2C_EEPROM_DEV_ADDR,
1278 1.1 dyoung eeprom_data);
1279 1.1 dyoung }
1280 1.1 dyoung
1281 1.1 dyoung /**
1282 1.1 dyoung * ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface
1283 1.1 dyoung * @hw: pointer to hardware structure
1284 1.1 dyoung * @byte_offset: EEPROM byte offset to write
1285 1.1 dyoung * @eeprom_data: value to write
1286 1.1 dyoung *
1287 1.1 dyoung * Performs byte write operation to SFP module's EEPROM over I2C interface.
1288 1.1 dyoung **/
1289 1.1 dyoung s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
1290 1.1 dyoung u8 eeprom_data)
1291 1.1 dyoung {
1292 1.1 dyoung DEBUGFUNC("ixgbe_write_i2c_eeprom_generic");
1293 1.1 dyoung
1294 1.1 dyoung return hw->phy.ops.write_i2c_byte(hw, byte_offset,
1295 1.1 dyoung IXGBE_I2C_EEPROM_DEV_ADDR,
1296 1.1 dyoung eeprom_data);
1297 1.1 dyoung }
1298 1.1 dyoung
1299 1.1 dyoung /**
1300 1.1 dyoung * ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
1301 1.1 dyoung * @hw: pointer to hardware structure
1302 1.1 dyoung * @byte_offset: byte offset to read
1303 1.1 dyoung * @data: value read
1304 1.1 dyoung *
1305 1.1 dyoung * Performs byte read operation to SFP module's EEPROM over I2C interface at
1306 1.1 dyoung * a specified deivce address.
1307 1.1 dyoung **/
1308 1.1 dyoung s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
1309 1.1 dyoung u8 dev_addr, u8 *data)
1310 1.1 dyoung {
1311 1.1 dyoung s32 status = IXGBE_SUCCESS;
1312 1.1 dyoung u32 max_retry = 10;
1313 1.1 dyoung u32 retry = 0;
1314 1.1 dyoung u16 swfw_mask = 0;
1315 1.1 dyoung bool nack = 1;
1316 1.1 dyoung
1317 1.1 dyoung DEBUGFUNC("ixgbe_read_i2c_byte_generic");
1318 1.1 dyoung
1319 1.1 dyoung if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
1320 1.1 dyoung swfw_mask = IXGBE_GSSR_PHY1_SM;
1321 1.1 dyoung else
1322 1.1 dyoung swfw_mask = IXGBE_GSSR_PHY0_SM;
1323 1.1 dyoung
1324 1.1 dyoung do {
1325 1.1 dyoung if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != IXGBE_SUCCESS) {
1326 1.1 dyoung status = IXGBE_ERR_SWFW_SYNC;
1327 1.1 dyoung goto read_byte_out;
1328 1.1 dyoung }
1329 1.1 dyoung
1330 1.1 dyoung ixgbe_i2c_start(hw);
1331 1.1 dyoung
1332 1.1 dyoung /* Device Address and write indication */
1333 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
1334 1.1 dyoung if (status != IXGBE_SUCCESS)
1335 1.1 dyoung goto fail;
1336 1.1 dyoung
1337 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
1338 1.1 dyoung if (status != IXGBE_SUCCESS)
1339 1.1 dyoung goto fail;
1340 1.1 dyoung
1341 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
1342 1.1 dyoung if (status != IXGBE_SUCCESS)
1343 1.1 dyoung goto fail;
1344 1.1 dyoung
1345 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
1346 1.1 dyoung if (status != IXGBE_SUCCESS)
1347 1.1 dyoung goto fail;
1348 1.1 dyoung
1349 1.1 dyoung ixgbe_i2c_start(hw);
1350 1.1 dyoung
1351 1.1 dyoung /* Device Address and read indication */
1352 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, (dev_addr | 0x1));
1353 1.1 dyoung if (status != IXGBE_SUCCESS)
1354 1.1 dyoung goto fail;
1355 1.1 dyoung
1356 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
1357 1.1 dyoung if (status != IXGBE_SUCCESS)
1358 1.1 dyoung goto fail;
1359 1.1 dyoung
1360 1.1 dyoung status = ixgbe_clock_in_i2c_byte(hw, data);
1361 1.1 dyoung if (status != IXGBE_SUCCESS)
1362 1.1 dyoung goto fail;
1363 1.1 dyoung
1364 1.1 dyoung status = ixgbe_clock_out_i2c_bit(hw, nack);
1365 1.1 dyoung if (status != IXGBE_SUCCESS)
1366 1.1 dyoung goto fail;
1367 1.1 dyoung
1368 1.1 dyoung ixgbe_i2c_stop(hw);
1369 1.1 dyoung break;
1370 1.1 dyoung
1371 1.1 dyoung fail:
1372 1.1 dyoung ixgbe_release_swfw_sync(hw, swfw_mask);
1373 1.1 dyoung msec_delay(100);
1374 1.1 dyoung ixgbe_i2c_bus_clear(hw);
1375 1.1 dyoung retry++;
1376 1.1 dyoung if (retry < max_retry)
1377 1.1 dyoung DEBUGOUT("I2C byte read error - Retrying.\n");
1378 1.1 dyoung else
1379 1.1 dyoung DEBUGOUT("I2C byte read error.\n");
1380 1.1 dyoung
1381 1.1 dyoung } while (retry < max_retry);
1382 1.1 dyoung
1383 1.1 dyoung ixgbe_release_swfw_sync(hw, swfw_mask);
1384 1.1 dyoung
1385 1.1 dyoung read_byte_out:
1386 1.1 dyoung return status;
1387 1.1 dyoung }
1388 1.1 dyoung
1389 1.1 dyoung /**
1390 1.1 dyoung * ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
1391 1.1 dyoung * @hw: pointer to hardware structure
1392 1.1 dyoung * @byte_offset: byte offset to write
1393 1.1 dyoung * @data: value to write
1394 1.1 dyoung *
1395 1.1 dyoung * Performs byte write operation to SFP module's EEPROM over I2C interface at
1396 1.1 dyoung * a specified device address.
1397 1.1 dyoung **/
1398 1.1 dyoung s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
1399 1.1 dyoung u8 dev_addr, u8 data)
1400 1.1 dyoung {
1401 1.1 dyoung s32 status = IXGBE_SUCCESS;
1402 1.2 christos u32 max_retry = 2;
1403 1.1 dyoung u32 retry = 0;
1404 1.1 dyoung u16 swfw_mask = 0;
1405 1.1 dyoung
1406 1.1 dyoung DEBUGFUNC("ixgbe_write_i2c_byte_generic");
1407 1.1 dyoung
1408 1.1 dyoung if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
1409 1.1 dyoung swfw_mask = IXGBE_GSSR_PHY1_SM;
1410 1.1 dyoung else
1411 1.1 dyoung swfw_mask = IXGBE_GSSR_PHY0_SM;
1412 1.1 dyoung
1413 1.1 dyoung if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != IXGBE_SUCCESS) {
1414 1.1 dyoung status = IXGBE_ERR_SWFW_SYNC;
1415 1.1 dyoung goto write_byte_out;
1416 1.1 dyoung }
1417 1.1 dyoung
1418 1.1 dyoung do {
1419 1.1 dyoung ixgbe_i2c_start(hw);
1420 1.1 dyoung
1421 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
1422 1.1 dyoung if (status != IXGBE_SUCCESS)
1423 1.1 dyoung goto fail;
1424 1.1 dyoung
1425 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
1426 1.1 dyoung if (status != IXGBE_SUCCESS)
1427 1.1 dyoung goto fail;
1428 1.1 dyoung
1429 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
1430 1.1 dyoung if (status != IXGBE_SUCCESS)
1431 1.1 dyoung goto fail;
1432 1.1 dyoung
1433 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
1434 1.1 dyoung if (status != IXGBE_SUCCESS)
1435 1.1 dyoung goto fail;
1436 1.1 dyoung
1437 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, data);
1438 1.1 dyoung if (status != IXGBE_SUCCESS)
1439 1.1 dyoung goto fail;
1440 1.1 dyoung
1441 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
1442 1.1 dyoung if (status != IXGBE_SUCCESS)
1443 1.1 dyoung goto fail;
1444 1.1 dyoung
1445 1.1 dyoung ixgbe_i2c_stop(hw);
1446 1.1 dyoung break;
1447 1.1 dyoung
1448 1.1 dyoung fail:
1449 1.1 dyoung ixgbe_i2c_bus_clear(hw);
1450 1.1 dyoung retry++;
1451 1.1 dyoung if (retry < max_retry)
1452 1.1 dyoung DEBUGOUT("I2C byte write error - Retrying.\n");
1453 1.1 dyoung else
1454 1.1 dyoung DEBUGOUT("I2C byte write error.\n");
1455 1.1 dyoung } while (retry < max_retry);
1456 1.1 dyoung
1457 1.1 dyoung ixgbe_release_swfw_sync(hw, swfw_mask);
1458 1.1 dyoung
1459 1.1 dyoung write_byte_out:
1460 1.1 dyoung return status;
1461 1.1 dyoung }
1462 1.1 dyoung
1463 1.1 dyoung /**
1464 1.1 dyoung * ixgbe_i2c_start - Sets I2C start condition
1465 1.1 dyoung * @hw: pointer to hardware structure
1466 1.1 dyoung *
1467 1.1 dyoung * Sets I2C start condition (High -> Low on SDA while SCL is High)
1468 1.1 dyoung **/
1469 1.1 dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw)
1470 1.1 dyoung {
1471 1.1 dyoung u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1472 1.1 dyoung
1473 1.1 dyoung DEBUGFUNC("ixgbe_i2c_start");
1474 1.1 dyoung
1475 1.1 dyoung /* Start condition must begin with data and clock high */
1476 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1);
1477 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl);
1478 1.1 dyoung
1479 1.1 dyoung /* Setup time for start condition (4.7us) */
1480 1.1 dyoung usec_delay(IXGBE_I2C_T_SU_STA);
1481 1.1 dyoung
1482 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 0);
1483 1.1 dyoung
1484 1.1 dyoung /* Hold time for start condition (4us) */
1485 1.1 dyoung usec_delay(IXGBE_I2C_T_HD_STA);
1486 1.1 dyoung
1487 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
1488 1.1 dyoung
1489 1.1 dyoung /* Minimum low period of clock is 4.7 us */
1490 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
1491 1.1 dyoung
1492 1.1 dyoung }
1493 1.1 dyoung
1494 1.1 dyoung /**
1495 1.1 dyoung * ixgbe_i2c_stop - Sets I2C stop condition
1496 1.1 dyoung * @hw: pointer to hardware structure
1497 1.1 dyoung *
1498 1.1 dyoung * Sets I2C stop condition (Low -> High on SDA while SCL is High)
1499 1.1 dyoung **/
1500 1.1 dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw)
1501 1.1 dyoung {
1502 1.1 dyoung u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1503 1.1 dyoung
1504 1.1 dyoung DEBUGFUNC("ixgbe_i2c_stop");
1505 1.1 dyoung
1506 1.1 dyoung /* Stop condition must begin with data low and clock high */
1507 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 0);
1508 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl);
1509 1.1 dyoung
1510 1.1 dyoung /* Setup time for stop condition (4us) */
1511 1.1 dyoung usec_delay(IXGBE_I2C_T_SU_STO);
1512 1.1 dyoung
1513 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1);
1514 1.1 dyoung
1515 1.1 dyoung /* bus free time between stop and start (4.7us)*/
1516 1.1 dyoung usec_delay(IXGBE_I2C_T_BUF);
1517 1.1 dyoung }
1518 1.1 dyoung
1519 1.1 dyoung /**
1520 1.1 dyoung * ixgbe_clock_in_i2c_byte - Clocks in one byte via I2C
1521 1.1 dyoung * @hw: pointer to hardware structure
1522 1.1 dyoung * @data: data byte to clock in
1523 1.1 dyoung *
1524 1.1 dyoung * Clocks in one byte data via I2C data/clock
1525 1.1 dyoung **/
1526 1.1 dyoung static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data)
1527 1.1 dyoung {
1528 1.1 dyoung s32 status = IXGBE_SUCCESS;
1529 1.1 dyoung s32 i;
1530 1.1 dyoung bool bit = 0;
1531 1.1 dyoung
1532 1.1 dyoung DEBUGFUNC("ixgbe_clock_in_i2c_byte");
1533 1.1 dyoung
1534 1.1 dyoung for (i = 7; i >= 0; i--) {
1535 1.1 dyoung status = ixgbe_clock_in_i2c_bit(hw, &bit);
1536 1.1 dyoung *data |= bit << i;
1537 1.1 dyoung
1538 1.1 dyoung if (status != IXGBE_SUCCESS)
1539 1.1 dyoung break;
1540 1.1 dyoung }
1541 1.1 dyoung
1542 1.1 dyoung return status;
1543 1.1 dyoung }
1544 1.1 dyoung
1545 1.1 dyoung /**
1546 1.1 dyoung * ixgbe_clock_out_i2c_byte - Clocks out one byte via I2C
1547 1.1 dyoung * @hw: pointer to hardware structure
1548 1.1 dyoung * @data: data byte clocked out
1549 1.1 dyoung *
1550 1.1 dyoung * Clocks out one byte data via I2C data/clock
1551 1.1 dyoung **/
1552 1.1 dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data)
1553 1.1 dyoung {
1554 1.1 dyoung s32 status = IXGBE_SUCCESS;
1555 1.1 dyoung s32 i;
1556 1.1 dyoung u32 i2cctl;
1557 1.1 dyoung bool bit = 0;
1558 1.1 dyoung
1559 1.1 dyoung DEBUGFUNC("ixgbe_clock_out_i2c_byte");
1560 1.1 dyoung
1561 1.1 dyoung for (i = 7; i >= 0; i--) {
1562 1.1 dyoung bit = (data >> i) & 0x1;
1563 1.1 dyoung status = ixgbe_clock_out_i2c_bit(hw, bit);
1564 1.1 dyoung
1565 1.1 dyoung if (status != IXGBE_SUCCESS)
1566 1.1 dyoung break;
1567 1.1 dyoung }
1568 1.1 dyoung
1569 1.1 dyoung /* Release SDA line (set high) */
1570 1.1 dyoung i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1571 1.1 dyoung i2cctl |= IXGBE_I2C_DATA_OUT;
1572 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, i2cctl);
1573 1.1 dyoung
1574 1.1 dyoung return status;
1575 1.1 dyoung }
1576 1.1 dyoung
1577 1.1 dyoung /**
1578 1.1 dyoung * ixgbe_get_i2c_ack - Polls for I2C ACK
1579 1.1 dyoung * @hw: pointer to hardware structure
1580 1.1 dyoung *
1581 1.1 dyoung * Clocks in/out one bit via I2C data/clock
1582 1.1 dyoung **/
1583 1.1 dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
1584 1.1 dyoung {
1585 1.1 dyoung s32 status;
1586 1.1 dyoung u32 i = 0;
1587 1.1 dyoung u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1588 1.1 dyoung u32 timeout = 10;
1589 1.1 dyoung bool ack = 1;
1590 1.1 dyoung
1591 1.1 dyoung DEBUGFUNC("ixgbe_get_i2c_ack");
1592 1.1 dyoung
1593 1.1 dyoung status = ixgbe_raise_i2c_clk(hw, &i2cctl);
1594 1.1 dyoung
1595 1.1 dyoung if (status != IXGBE_SUCCESS)
1596 1.1 dyoung goto out;
1597 1.1 dyoung
1598 1.1 dyoung /* Minimum high period of clock is 4us */
1599 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
1600 1.1 dyoung
1601 1.1 dyoung /* Poll for ACK. Note that ACK in I2C spec is
1602 1.1 dyoung * transition from 1 to 0 */
1603 1.1 dyoung for (i = 0; i < timeout; i++) {
1604 1.1 dyoung i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1605 1.1 dyoung ack = ixgbe_get_i2c_data(&i2cctl);
1606 1.1 dyoung
1607 1.1 dyoung usec_delay(1);
1608 1.1 dyoung if (ack == 0)
1609 1.1 dyoung break;
1610 1.1 dyoung }
1611 1.1 dyoung
1612 1.1 dyoung if (ack == 1) {
1613 1.1 dyoung DEBUGOUT("I2C ack was not received.\n");
1614 1.1 dyoung status = IXGBE_ERR_I2C;
1615 1.1 dyoung }
1616 1.1 dyoung
1617 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
1618 1.1 dyoung
1619 1.1 dyoung /* Minimum low period of clock is 4.7 us */
1620 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
1621 1.1 dyoung
1622 1.1 dyoung out:
1623 1.1 dyoung return status;
1624 1.1 dyoung }
1625 1.1 dyoung
1626 1.1 dyoung /**
1627 1.1 dyoung * ixgbe_clock_in_i2c_bit - Clocks in one bit via I2C data/clock
1628 1.1 dyoung * @hw: pointer to hardware structure
1629 1.1 dyoung * @data: read data value
1630 1.1 dyoung *
1631 1.1 dyoung * Clocks in one bit via I2C data/clock
1632 1.1 dyoung **/
1633 1.1 dyoung static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
1634 1.1 dyoung {
1635 1.1 dyoung s32 status;
1636 1.1 dyoung u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1637 1.1 dyoung
1638 1.1 dyoung DEBUGFUNC("ixgbe_clock_in_i2c_bit");
1639 1.1 dyoung
1640 1.1 dyoung status = ixgbe_raise_i2c_clk(hw, &i2cctl);
1641 1.1 dyoung
1642 1.1 dyoung /* Minimum high period of clock is 4us */
1643 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
1644 1.1 dyoung
1645 1.1 dyoung i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1646 1.1 dyoung *data = ixgbe_get_i2c_data(&i2cctl);
1647 1.1 dyoung
1648 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
1649 1.1 dyoung
1650 1.1 dyoung /* Minimum low period of clock is 4.7 us */
1651 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
1652 1.1 dyoung
1653 1.1 dyoung return status;
1654 1.1 dyoung }
1655 1.1 dyoung
1656 1.1 dyoung /**
1657 1.1 dyoung * ixgbe_clock_out_i2c_bit - Clocks in/out one bit via I2C data/clock
1658 1.1 dyoung * @hw: pointer to hardware structure
1659 1.1 dyoung * @data: data value to write
1660 1.1 dyoung *
1661 1.1 dyoung * Clocks out one bit via I2C data/clock
1662 1.1 dyoung **/
1663 1.1 dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
1664 1.1 dyoung {
1665 1.1 dyoung s32 status;
1666 1.1 dyoung u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1667 1.1 dyoung
1668 1.1 dyoung DEBUGFUNC("ixgbe_clock_out_i2c_bit");
1669 1.1 dyoung
1670 1.1 dyoung status = ixgbe_set_i2c_data(hw, &i2cctl, data);
1671 1.1 dyoung if (status == IXGBE_SUCCESS) {
1672 1.1 dyoung status = ixgbe_raise_i2c_clk(hw, &i2cctl);
1673 1.1 dyoung
1674 1.1 dyoung /* Minimum high period of clock is 4us */
1675 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
1676 1.1 dyoung
1677 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
1678 1.1 dyoung
1679 1.1 dyoung /* Minimum low period of clock is 4.7 us.
1680 1.1 dyoung * This also takes care of the data hold time.
1681 1.1 dyoung */
1682 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
1683 1.1 dyoung } else {
1684 1.1 dyoung status = IXGBE_ERR_I2C;
1685 1.1 dyoung DEBUGOUT1("I2C data was not set to %X\n", data);
1686 1.1 dyoung }
1687 1.1 dyoung
1688 1.1 dyoung return status;
1689 1.1 dyoung }
1690 1.1 dyoung /**
1691 1.1 dyoung * ixgbe_raise_i2c_clk - Raises the I2C SCL clock
1692 1.1 dyoung * @hw: pointer to hardware structure
1693 1.1 dyoung * @i2cctl: Current value of I2CCTL register
1694 1.1 dyoung *
1695 1.1 dyoung * Raises the I2C clock line '0'->'1'
1696 1.1 dyoung **/
1697 1.1 dyoung static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
1698 1.1 dyoung {
1699 1.1 dyoung s32 status = IXGBE_SUCCESS;
1700 1.1 dyoung
1701 1.1 dyoung DEBUGFUNC("ixgbe_raise_i2c_clk");
1702 1.1 dyoung
1703 1.1 dyoung *i2cctl |= IXGBE_I2C_CLK_OUT;
1704 1.1 dyoung
1705 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
1706 1.1 dyoung
1707 1.1 dyoung /* SCL rise time (1000ns) */
1708 1.1 dyoung usec_delay(IXGBE_I2C_T_RISE);
1709 1.1 dyoung
1710 1.1 dyoung return status;
1711 1.1 dyoung }
1712 1.1 dyoung
1713 1.1 dyoung /**
1714 1.1 dyoung * ixgbe_lower_i2c_clk - Lowers the I2C SCL clock
1715 1.1 dyoung * @hw: pointer to hardware structure
1716 1.1 dyoung * @i2cctl: Current value of I2CCTL register
1717 1.1 dyoung *
1718 1.1 dyoung * Lowers the I2C clock line '1'->'0'
1719 1.1 dyoung **/
1720 1.1 dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
1721 1.1 dyoung {
1722 1.1 dyoung
1723 1.1 dyoung DEBUGFUNC("ixgbe_lower_i2c_clk");
1724 1.1 dyoung
1725 1.1 dyoung *i2cctl &= ~IXGBE_I2C_CLK_OUT;
1726 1.1 dyoung
1727 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
1728 1.1 dyoung
1729 1.1 dyoung /* SCL fall time (300ns) */
1730 1.1 dyoung usec_delay(IXGBE_I2C_T_FALL);
1731 1.1 dyoung }
1732 1.1 dyoung
1733 1.1 dyoung /**
1734 1.1 dyoung * ixgbe_set_i2c_data - Sets the I2C data bit
1735 1.1 dyoung * @hw: pointer to hardware structure
1736 1.1 dyoung * @i2cctl: Current value of I2CCTL register
1737 1.1 dyoung * @data: I2C data value (0 or 1) to set
1738 1.1 dyoung *
1739 1.1 dyoung * Sets the I2C data bit
1740 1.1 dyoung **/
1741 1.1 dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
1742 1.1 dyoung {
1743 1.1 dyoung s32 status = IXGBE_SUCCESS;
1744 1.1 dyoung
1745 1.1 dyoung DEBUGFUNC("ixgbe_set_i2c_data");
1746 1.1 dyoung
1747 1.1 dyoung if (data)
1748 1.1 dyoung *i2cctl |= IXGBE_I2C_DATA_OUT;
1749 1.1 dyoung else
1750 1.1 dyoung *i2cctl &= ~IXGBE_I2C_DATA_OUT;
1751 1.1 dyoung
1752 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
1753 1.1 dyoung
1754 1.1 dyoung /* Data rise/fall (1000ns/300ns) and set-up time (250ns) */
1755 1.1 dyoung usec_delay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA);
1756 1.1 dyoung
1757 1.1 dyoung /* Verify data was set correctly */
1758 1.1 dyoung *i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1759 1.1 dyoung if (data != ixgbe_get_i2c_data(i2cctl)) {
1760 1.1 dyoung status = IXGBE_ERR_I2C;
1761 1.1 dyoung DEBUGOUT1("Error - I2C data was not set to %X.\n", data);
1762 1.1 dyoung }
1763 1.1 dyoung
1764 1.1 dyoung return status;
1765 1.1 dyoung }
1766 1.1 dyoung
1767 1.1 dyoung /**
1768 1.1 dyoung * ixgbe_get_i2c_data - Reads the I2C SDA data bit
1769 1.1 dyoung * @hw: pointer to hardware structure
1770 1.1 dyoung * @i2cctl: Current value of I2CCTL register
1771 1.1 dyoung *
1772 1.1 dyoung * Returns the I2C data bit value
1773 1.1 dyoung **/
1774 1.1 dyoung static bool ixgbe_get_i2c_data(u32 *i2cctl)
1775 1.1 dyoung {
1776 1.1 dyoung bool data;
1777 1.1 dyoung
1778 1.1 dyoung DEBUGFUNC("ixgbe_get_i2c_data");
1779 1.1 dyoung
1780 1.1 dyoung if (*i2cctl & IXGBE_I2C_DATA_IN)
1781 1.1 dyoung data = 1;
1782 1.1 dyoung else
1783 1.1 dyoung data = 0;
1784 1.1 dyoung
1785 1.1 dyoung return data;
1786 1.1 dyoung }
1787 1.1 dyoung
1788 1.1 dyoung /**
1789 1.1 dyoung * ixgbe_i2c_bus_clear - Clears the I2C bus
1790 1.1 dyoung * @hw: pointer to hardware structure
1791 1.1 dyoung *
1792 1.1 dyoung * Clears the I2C bus by sending nine clock pulses.
1793 1.1 dyoung * Used when data line is stuck low.
1794 1.1 dyoung **/
1795 1.1 dyoung void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
1796 1.1 dyoung {
1797 1.1 dyoung u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
1798 1.1 dyoung u32 i;
1799 1.1 dyoung
1800 1.1 dyoung DEBUGFUNC("ixgbe_i2c_bus_clear");
1801 1.1 dyoung
1802 1.1 dyoung ixgbe_i2c_start(hw);
1803 1.1 dyoung
1804 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1);
1805 1.1 dyoung
1806 1.1 dyoung for (i = 0; i < 9; i++) {
1807 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl);
1808 1.1 dyoung
1809 1.1 dyoung /* Min high period of clock is 4us */
1810 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
1811 1.1 dyoung
1812 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
1813 1.1 dyoung
1814 1.1 dyoung /* Min low period of clock is 4.7us*/
1815 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
1816 1.1 dyoung }
1817 1.1 dyoung
1818 1.1 dyoung ixgbe_i2c_start(hw);
1819 1.1 dyoung
1820 1.1 dyoung /* Put the i2c bus back to default state */
1821 1.1 dyoung ixgbe_i2c_stop(hw);
1822 1.1 dyoung }
1823 1.1 dyoung
1824 1.1 dyoung /**
1825 1.1 dyoung * ixgbe_tn_check_overtemp - Checks if an overtemp occured.
1826 1.1 dyoung * @hw: pointer to hardware structure
1827 1.1 dyoung *
1828 1.1 dyoung * Checks if the LASI temp alarm status was triggered due to overtemp
1829 1.1 dyoung **/
1830 1.1 dyoung s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
1831 1.1 dyoung {
1832 1.1 dyoung s32 status = IXGBE_SUCCESS;
1833 1.1 dyoung u16 phy_data = 0;
1834 1.1 dyoung
1835 1.1 dyoung DEBUGFUNC("ixgbe_tn_check_overtemp");
1836 1.1 dyoung
1837 1.1 dyoung if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
1838 1.1 dyoung goto out;
1839 1.1 dyoung
1840 1.1 dyoung /* Check that the LASI temp alarm status was triggered */
1841 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
1842 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data);
1843 1.1 dyoung
1844 1.1 dyoung if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
1845 1.1 dyoung goto out;
1846 1.1 dyoung
1847 1.1 dyoung status = IXGBE_ERR_OVERTEMP;
1848 1.1 dyoung out:
1849 1.1 dyoung return status;
1850 1.1 dyoung }
1851