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