ixgbe_phy.c revision 1.14 1 1.14 msaitoh /* $NetBSD: ixgbe_phy.c,v 1.14 2017/12/06 04:08:50 msaitoh Exp $ */
2 1.12 msaitoh
3 1.1 dyoung /******************************************************************************
4 1.14 msaitoh SPDX-License-Identifier: BSD-3-Clause
5 1.1 dyoung
6 1.12 msaitoh Copyright (c) 2001-2017, Intel Corporation
7 1.1 dyoung All rights reserved.
8 1.12 msaitoh
9 1.12 msaitoh Redistribution and use in source and binary forms, with or without
10 1.1 dyoung modification, are permitted provided that the following conditions are met:
11 1.12 msaitoh
12 1.12 msaitoh 1. Redistributions of source code must retain the above copyright notice,
13 1.1 dyoung this list of conditions and the following disclaimer.
14 1.12 msaitoh
15 1.12 msaitoh 2. Redistributions in binary form must reproduce the above copyright
16 1.12 msaitoh notice, this list of conditions and the following disclaimer in the
17 1.1 dyoung documentation and/or other materials provided with the distribution.
18 1.12 msaitoh
19 1.12 msaitoh 3. Neither the name of the Intel Corporation nor the names of its
20 1.12 msaitoh contributors may be used to endorse or promote products derived from
21 1.1 dyoung this software without specific prior written permission.
22 1.12 msaitoh
23 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 1.12 msaitoh AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 1.12 msaitoh IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 1.12 msaitoh ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 1.12 msaitoh LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 1.12 msaitoh CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 1.12 msaitoh SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 1.12 msaitoh INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 1.12 msaitoh CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 1.1 dyoung ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 1.1 dyoung POSSIBILITY OF SUCH DAMAGE.
34 1.1 dyoung
35 1.1 dyoung ******************************************************************************/
36 1.12 msaitoh /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 320688 2017-07-05 17:27:03Z erj $*/
37 1.1 dyoung
38 1.1 dyoung #include "ixgbe_api.h"
39 1.1 dyoung #include "ixgbe_common.h"
40 1.1 dyoung #include "ixgbe_phy.h"
41 1.1 dyoung
42 1.13 msaitoh #include <dev/mii/mdio.h>
43 1.13 msaitoh
44 1.1 dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw);
45 1.1 dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw);
46 1.1 dyoung static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data);
47 1.1 dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data);
48 1.1 dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw);
49 1.1 dyoung static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data);
50 1.1 dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data);
51 1.3 msaitoh static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
52 1.1 dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
53 1.1 dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data);
54 1.7 msaitoh static bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl);
55 1.5 msaitoh static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
56 1.5 msaitoh u8 *sff8472_data);
57 1.1 dyoung
58 1.1 dyoung /**
59 1.7 msaitoh * ixgbe_out_i2c_byte_ack - Send I2C byte with ack
60 1.7 msaitoh * @hw: pointer to the hardware structure
61 1.7 msaitoh * @byte: byte to send
62 1.7 msaitoh *
63 1.7 msaitoh * Returns an error code on error.
64 1.7 msaitoh */
65 1.7 msaitoh static s32 ixgbe_out_i2c_byte_ack(struct ixgbe_hw *hw, u8 byte)
66 1.7 msaitoh {
67 1.7 msaitoh s32 status;
68 1.7 msaitoh
69 1.7 msaitoh status = ixgbe_clock_out_i2c_byte(hw, byte);
70 1.7 msaitoh if (status)
71 1.7 msaitoh return status;
72 1.7 msaitoh return ixgbe_get_i2c_ack(hw);
73 1.7 msaitoh }
74 1.7 msaitoh
75 1.7 msaitoh /**
76 1.7 msaitoh * ixgbe_in_i2c_byte_ack - Receive an I2C byte and send ack
77 1.7 msaitoh * @hw: pointer to the hardware structure
78 1.7 msaitoh * @byte: pointer to a u8 to receive the byte
79 1.7 msaitoh *
80 1.7 msaitoh * Returns an error code on error.
81 1.7 msaitoh */
82 1.7 msaitoh static s32 ixgbe_in_i2c_byte_ack(struct ixgbe_hw *hw, u8 *byte)
83 1.7 msaitoh {
84 1.7 msaitoh s32 status;
85 1.7 msaitoh
86 1.7 msaitoh status = ixgbe_clock_in_i2c_byte(hw, byte);
87 1.7 msaitoh if (status)
88 1.7 msaitoh return status;
89 1.7 msaitoh /* ACK */
90 1.7 msaitoh return ixgbe_clock_out_i2c_bit(hw, FALSE);
91 1.7 msaitoh }
92 1.7 msaitoh
93 1.7 msaitoh /**
94 1.7 msaitoh * ixgbe_ones_comp_byte_add - Perform one's complement addition
95 1.7 msaitoh * @add1 - addend 1
96 1.7 msaitoh * @add2 - addend 2
97 1.7 msaitoh *
98 1.7 msaitoh * Returns one's complement 8-bit sum.
99 1.7 msaitoh */
100 1.7 msaitoh static u8 ixgbe_ones_comp_byte_add(u8 add1, u8 add2)
101 1.7 msaitoh {
102 1.7 msaitoh u16 sum = add1 + add2;
103 1.7 msaitoh
104 1.7 msaitoh sum = (sum & 0xFF) + (sum >> 8);
105 1.7 msaitoh return sum & 0xFF;
106 1.7 msaitoh }
107 1.7 msaitoh
108 1.7 msaitoh /**
109 1.8 msaitoh * ixgbe_read_i2c_combined_generic_int - Perform I2C read combined operation
110 1.7 msaitoh * @hw: pointer to the hardware structure
111 1.7 msaitoh * @addr: I2C bus address to read from
112 1.7 msaitoh * @reg: I2C device register to read from
113 1.7 msaitoh * @val: pointer to location to receive read value
114 1.8 msaitoh * @lock: TRUE if to take and release semaphore
115 1.7 msaitoh *
116 1.7 msaitoh * Returns an error code on error.
117 1.7 msaitoh */
118 1.12 msaitoh s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, u16 reg,
119 1.12 msaitoh u16 *val, bool lock)
120 1.7 msaitoh {
121 1.7 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask;
122 1.12 msaitoh int max_retry = 3;
123 1.7 msaitoh int retry = 0;
124 1.7 msaitoh u8 csum_byte;
125 1.7 msaitoh u8 high_bits;
126 1.7 msaitoh u8 low_bits;
127 1.7 msaitoh u8 reg_high;
128 1.7 msaitoh u8 csum;
129 1.7 msaitoh
130 1.7 msaitoh reg_high = ((reg >> 7) & 0xFE) | 1; /* Indicate read combined */
131 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
132 1.7 msaitoh csum = ~csum;
133 1.7 msaitoh do {
134 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
135 1.7 msaitoh return IXGBE_ERR_SWFW_SYNC;
136 1.7 msaitoh ixgbe_i2c_start(hw);
137 1.7 msaitoh /* Device Address and write indication */
138 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, addr))
139 1.7 msaitoh goto fail;
140 1.7 msaitoh /* Write bits 14:8 */
141 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg_high))
142 1.7 msaitoh goto fail;
143 1.7 msaitoh /* Write bits 7:0 */
144 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF))
145 1.7 msaitoh goto fail;
146 1.7 msaitoh /* Write csum */
147 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, csum))
148 1.7 msaitoh goto fail;
149 1.7 msaitoh /* Re-start condition */
150 1.7 msaitoh ixgbe_i2c_start(hw);
151 1.7 msaitoh /* Device Address and read indication */
152 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, addr | 1))
153 1.7 msaitoh goto fail;
154 1.7 msaitoh /* Get upper bits */
155 1.7 msaitoh if (ixgbe_in_i2c_byte_ack(hw, &high_bits))
156 1.7 msaitoh goto fail;
157 1.7 msaitoh /* Get low bits */
158 1.7 msaitoh if (ixgbe_in_i2c_byte_ack(hw, &low_bits))
159 1.7 msaitoh goto fail;
160 1.7 msaitoh /* Get csum */
161 1.7 msaitoh if (ixgbe_clock_in_i2c_byte(hw, &csum_byte))
162 1.7 msaitoh goto fail;
163 1.7 msaitoh /* NACK */
164 1.7 msaitoh if (ixgbe_clock_out_i2c_bit(hw, FALSE))
165 1.7 msaitoh goto fail;
166 1.7 msaitoh ixgbe_i2c_stop(hw);
167 1.8 msaitoh if (lock)
168 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
169 1.7 msaitoh *val = (high_bits << 8) | low_bits;
170 1.7 msaitoh return 0;
171 1.7 msaitoh
172 1.7 msaitoh fail:
173 1.7 msaitoh ixgbe_i2c_bus_clear(hw);
174 1.8 msaitoh if (lock)
175 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
176 1.7 msaitoh retry++;
177 1.7 msaitoh if (retry < max_retry)
178 1.7 msaitoh DEBUGOUT("I2C byte read combined error - Retrying.\n");
179 1.7 msaitoh else
180 1.7 msaitoh DEBUGOUT("I2C byte read combined error.\n");
181 1.7 msaitoh } while (retry < max_retry);
182 1.7 msaitoh
183 1.7 msaitoh return IXGBE_ERR_I2C;
184 1.7 msaitoh }
185 1.7 msaitoh
186 1.7 msaitoh /**
187 1.8 msaitoh * ixgbe_write_i2c_combined_generic_int - Perform I2C write combined operation
188 1.7 msaitoh * @hw: pointer to the hardware structure
189 1.7 msaitoh * @addr: I2C bus address to write to
190 1.7 msaitoh * @reg: I2C device register to write to
191 1.7 msaitoh * @val: value to write
192 1.8 msaitoh * @lock: TRUE if to take and release semaphore
193 1.7 msaitoh *
194 1.7 msaitoh * Returns an error code on error.
195 1.7 msaitoh */
196 1.12 msaitoh s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, u16 reg,
197 1.12 msaitoh u16 val, bool lock)
198 1.7 msaitoh {
199 1.8 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask;
200 1.7 msaitoh int max_retry = 1;
201 1.7 msaitoh int retry = 0;
202 1.7 msaitoh u8 reg_high;
203 1.7 msaitoh u8 csum;
204 1.7 msaitoh
205 1.7 msaitoh reg_high = (reg >> 7) & 0xFE; /* Indicate write combined */
206 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
207 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(csum, val >> 8);
208 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(csum, val & 0xFF);
209 1.7 msaitoh csum = ~csum;
210 1.7 msaitoh do {
211 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
212 1.8 msaitoh return IXGBE_ERR_SWFW_SYNC;
213 1.7 msaitoh ixgbe_i2c_start(hw);
214 1.7 msaitoh /* Device Address and write indication */
215 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, addr))
216 1.7 msaitoh goto fail;
217 1.7 msaitoh /* Write bits 14:8 */
218 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg_high))
219 1.7 msaitoh goto fail;
220 1.7 msaitoh /* Write bits 7:0 */
221 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF))
222 1.7 msaitoh goto fail;
223 1.7 msaitoh /* Write data 15:8 */
224 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, val >> 8))
225 1.7 msaitoh goto fail;
226 1.7 msaitoh /* Write data 7:0 */
227 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, val & 0xFF))
228 1.7 msaitoh goto fail;
229 1.7 msaitoh /* Write csum */
230 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, csum))
231 1.7 msaitoh goto fail;
232 1.7 msaitoh ixgbe_i2c_stop(hw);
233 1.8 msaitoh if (lock)
234 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
235 1.7 msaitoh return 0;
236 1.7 msaitoh
237 1.7 msaitoh fail:
238 1.7 msaitoh ixgbe_i2c_bus_clear(hw);
239 1.8 msaitoh if (lock)
240 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
241 1.7 msaitoh retry++;
242 1.7 msaitoh if (retry < max_retry)
243 1.7 msaitoh DEBUGOUT("I2C byte write combined error - Retrying.\n");
244 1.7 msaitoh else
245 1.7 msaitoh DEBUGOUT("I2C byte write combined error.\n");
246 1.7 msaitoh } while (retry < max_retry);
247 1.7 msaitoh
248 1.7 msaitoh return IXGBE_ERR_I2C;
249 1.7 msaitoh }
250 1.7 msaitoh
251 1.7 msaitoh /**
252 1.1 dyoung * ixgbe_init_phy_ops_generic - Inits PHY function ptrs
253 1.1 dyoung * @hw: pointer to the hardware structure
254 1.1 dyoung *
255 1.1 dyoung * Initialize the function pointers.
256 1.1 dyoung **/
257 1.1 dyoung s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
258 1.1 dyoung {
259 1.1 dyoung struct ixgbe_phy_info *phy = &hw->phy;
260 1.1 dyoung
261 1.1 dyoung DEBUGFUNC("ixgbe_init_phy_ops_generic");
262 1.1 dyoung
263 1.1 dyoung /* PHY */
264 1.7 msaitoh phy->ops.identify = ixgbe_identify_phy_generic;
265 1.7 msaitoh phy->ops.reset = ixgbe_reset_phy_generic;
266 1.7 msaitoh phy->ops.read_reg = ixgbe_read_phy_reg_generic;
267 1.7 msaitoh phy->ops.write_reg = ixgbe_write_phy_reg_generic;
268 1.7 msaitoh phy->ops.read_reg_mdi = ixgbe_read_phy_reg_mdi;
269 1.7 msaitoh phy->ops.write_reg_mdi = ixgbe_write_phy_reg_mdi;
270 1.7 msaitoh phy->ops.setup_link = ixgbe_setup_phy_link_generic;
271 1.7 msaitoh phy->ops.setup_link_speed = ixgbe_setup_phy_link_speed_generic;
272 1.1 dyoung phy->ops.check_link = NULL;
273 1.1 dyoung phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic;
274 1.7 msaitoh phy->ops.read_i2c_byte = ixgbe_read_i2c_byte_generic;
275 1.7 msaitoh phy->ops.write_i2c_byte = ixgbe_write_i2c_byte_generic;
276 1.7 msaitoh phy->ops.read_i2c_sff8472 = ixgbe_read_i2c_sff8472_generic;
277 1.7 msaitoh phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_generic;
278 1.7 msaitoh phy->ops.write_i2c_eeprom = ixgbe_write_i2c_eeprom_generic;
279 1.7 msaitoh phy->ops.i2c_bus_clear = ixgbe_i2c_bus_clear;
280 1.7 msaitoh phy->ops.identify_sfp = ixgbe_identify_module_generic;
281 1.1 dyoung phy->sfp_type = ixgbe_sfp_type_unknown;
282 1.8 msaitoh phy->ops.read_i2c_byte_unlocked = ixgbe_read_i2c_byte_generic_unlocked;
283 1.8 msaitoh phy->ops.write_i2c_byte_unlocked =
284 1.8 msaitoh ixgbe_write_i2c_byte_generic_unlocked;
285 1.7 msaitoh phy->ops.check_overtemp = ixgbe_tn_check_overtemp;
286 1.1 dyoung return IXGBE_SUCCESS;
287 1.1 dyoung }
288 1.1 dyoung
289 1.1 dyoung /**
290 1.12 msaitoh * ixgbe_probe_phy - Probe a single address for a PHY
291 1.12 msaitoh * @hw: pointer to hardware structure
292 1.12 msaitoh * @phy_addr: PHY address to probe
293 1.12 msaitoh *
294 1.12 msaitoh * Returns TRUE if PHY found
295 1.12 msaitoh */
296 1.12 msaitoh static bool ixgbe_probe_phy(struct ixgbe_hw *hw, u16 phy_addr)
297 1.12 msaitoh {
298 1.12 msaitoh u16 ext_ability = 0;
299 1.12 msaitoh
300 1.12 msaitoh if (!ixgbe_validate_phy_addr(hw, phy_addr)) {
301 1.12 msaitoh DEBUGOUT1("Unable to validate PHY address 0x%04X\n",
302 1.12 msaitoh phy_addr);
303 1.12 msaitoh return FALSE;
304 1.12 msaitoh }
305 1.12 msaitoh
306 1.12 msaitoh if (ixgbe_get_phy_id(hw))
307 1.12 msaitoh return FALSE;
308 1.12 msaitoh
309 1.12 msaitoh hw->phy.type = ixgbe_get_phy_type_from_id(hw->phy.id);
310 1.12 msaitoh
311 1.12 msaitoh if (hw->phy.type == ixgbe_phy_unknown) {
312 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
313 1.12 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability);
314 1.12 msaitoh if (ext_ability &
315 1.12 msaitoh (IXGBE_MDIO_PHY_10GBASET_ABILITY |
316 1.12 msaitoh IXGBE_MDIO_PHY_1000BASET_ABILITY))
317 1.12 msaitoh hw->phy.type = ixgbe_phy_cu_unknown;
318 1.12 msaitoh else
319 1.12 msaitoh hw->phy.type = ixgbe_phy_generic;
320 1.12 msaitoh }
321 1.12 msaitoh
322 1.12 msaitoh return TRUE;
323 1.12 msaitoh }
324 1.12 msaitoh
325 1.12 msaitoh /**
326 1.1 dyoung * ixgbe_identify_phy_generic - Get physical layer module
327 1.1 dyoung * @hw: pointer to hardware structure
328 1.1 dyoung *
329 1.1 dyoung * Determines the physical layer module found on the current adapter.
330 1.1 dyoung **/
331 1.1 dyoung s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
332 1.1 dyoung {
333 1.1 dyoung s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
334 1.12 msaitoh u16 phy_addr;
335 1.1 dyoung
336 1.1 dyoung DEBUGFUNC("ixgbe_identify_phy_generic");
337 1.1 dyoung
338 1.7 msaitoh if (!hw->phy.phy_semaphore_mask) {
339 1.7 msaitoh if (hw->bus.lan_id)
340 1.7 msaitoh hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM;
341 1.7 msaitoh else
342 1.7 msaitoh hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM;
343 1.7 msaitoh }
344 1.7 msaitoh
345 1.12 msaitoh if (hw->phy.type != ixgbe_phy_unknown)
346 1.12 msaitoh return IXGBE_SUCCESS;
347 1.1 dyoung
348 1.12 msaitoh if (hw->phy.nw_mng_if_sel) {
349 1.12 msaitoh phy_addr = (hw->phy.nw_mng_if_sel &
350 1.12 msaitoh IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >>
351 1.12 msaitoh IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT;
352 1.12 msaitoh if (ixgbe_probe_phy(hw, phy_addr))
353 1.12 msaitoh return IXGBE_SUCCESS;
354 1.12 msaitoh else
355 1.12 msaitoh return IXGBE_ERR_PHY_ADDR_INVALID;
356 1.12 msaitoh }
357 1.7 msaitoh
358 1.12 msaitoh for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
359 1.12 msaitoh if (ixgbe_probe_phy(hw, phy_addr)) {
360 1.12 msaitoh status = IXGBE_SUCCESS;
361 1.12 msaitoh break;
362 1.6 msaitoh }
363 1.1 dyoung }
364 1.1 dyoung
365 1.12 msaitoh /* Certain media types do not have a phy so an address will not
366 1.12 msaitoh * be found and the code will take this path. Caller has to
367 1.12 msaitoh * decide if it is an error or not.
368 1.12 msaitoh */
369 1.12 msaitoh if (status != IXGBE_SUCCESS)
370 1.12 msaitoh hw->phy.addr = 0;
371 1.12 msaitoh
372 1.1 dyoung return status;
373 1.1 dyoung }
374 1.1 dyoung
375 1.1 dyoung /**
376 1.7 msaitoh * ixgbe_check_reset_blocked - check status of MNG FW veto bit
377 1.7 msaitoh * @hw: pointer to the hardware structure
378 1.7 msaitoh *
379 1.7 msaitoh * This function checks the MMNGC.MNG_VETO bit to see if there are
380 1.7 msaitoh * any constraints on link from manageability. For MAC's that don't
381 1.7 msaitoh * have this bit just return faluse since the link can not be blocked
382 1.7 msaitoh * via this method.
383 1.7 msaitoh **/
384 1.7 msaitoh s32 ixgbe_check_reset_blocked(struct ixgbe_hw *hw)
385 1.7 msaitoh {
386 1.7 msaitoh u32 mmngc;
387 1.7 msaitoh
388 1.7 msaitoh DEBUGFUNC("ixgbe_check_reset_blocked");
389 1.7 msaitoh
390 1.7 msaitoh /* If we don't have this bit, it can't be blocking */
391 1.7 msaitoh if (hw->mac.type == ixgbe_mac_82598EB)
392 1.7 msaitoh return FALSE;
393 1.7 msaitoh
394 1.7 msaitoh mmngc = IXGBE_READ_REG(hw, IXGBE_MMNGC);
395 1.7 msaitoh if (mmngc & IXGBE_MMNGC_MNG_VETO) {
396 1.7 msaitoh ERROR_REPORT1(IXGBE_ERROR_SOFTWARE,
397 1.7 msaitoh "MNG_VETO bit detected.\n");
398 1.7 msaitoh return TRUE;
399 1.7 msaitoh }
400 1.7 msaitoh
401 1.7 msaitoh return FALSE;
402 1.7 msaitoh }
403 1.7 msaitoh
404 1.7 msaitoh /**
405 1.1 dyoung * ixgbe_validate_phy_addr - Determines phy address is valid
406 1.1 dyoung * @hw: pointer to hardware structure
407 1.1 dyoung *
408 1.1 dyoung **/
409 1.1 dyoung bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr)
410 1.1 dyoung {
411 1.1 dyoung u16 phy_id = 0;
412 1.1 dyoung bool valid = FALSE;
413 1.1 dyoung
414 1.1 dyoung DEBUGFUNC("ixgbe_validate_phy_addr");
415 1.1 dyoung
416 1.1 dyoung hw->phy.addr = phy_addr;
417 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
418 1.3 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id);
419 1.1 dyoung
420 1.1 dyoung if (phy_id != 0xFFFF && phy_id != 0x0)
421 1.1 dyoung valid = TRUE;
422 1.1 dyoung
423 1.12 msaitoh DEBUGOUT1("PHY ID HIGH is 0x%04X\n", phy_id);
424 1.12 msaitoh
425 1.1 dyoung return valid;
426 1.1 dyoung }
427 1.1 dyoung
428 1.1 dyoung /**
429 1.1 dyoung * ixgbe_get_phy_id - Get the phy type
430 1.1 dyoung * @hw: pointer to hardware structure
431 1.1 dyoung *
432 1.1 dyoung **/
433 1.1 dyoung s32 ixgbe_get_phy_id(struct ixgbe_hw *hw)
434 1.1 dyoung {
435 1.1 dyoung u32 status;
436 1.1 dyoung u16 phy_id_high = 0;
437 1.1 dyoung u16 phy_id_low = 0;
438 1.1 dyoung
439 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_id");
440 1.1 dyoung
441 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
442 1.3 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE,
443 1.3 msaitoh &phy_id_high);
444 1.1 dyoung
445 1.1 dyoung if (status == IXGBE_SUCCESS) {
446 1.1 dyoung hw->phy.id = (u32)(phy_id_high << 16);
447 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_LOW,
448 1.3 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE,
449 1.3 msaitoh &phy_id_low);
450 1.1 dyoung hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK);
451 1.1 dyoung hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);
452 1.1 dyoung }
453 1.12 msaitoh DEBUGOUT2("PHY_ID_HIGH 0x%04X, PHY_ID_LOW 0x%04X\n",
454 1.12 msaitoh phy_id_high, phy_id_low);
455 1.12 msaitoh
456 1.1 dyoung return status;
457 1.1 dyoung }
458 1.1 dyoung
459 1.1 dyoung /**
460 1.1 dyoung * ixgbe_get_phy_type_from_id - Get the phy type
461 1.12 msaitoh * @phy_id: PHY ID information
462 1.1 dyoung *
463 1.1 dyoung **/
464 1.1 dyoung enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
465 1.1 dyoung {
466 1.1 dyoung enum ixgbe_phy_type phy_type;
467 1.1 dyoung
468 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_type_from_id");
469 1.1 dyoung
470 1.1 dyoung switch (phy_id) {
471 1.1 dyoung case TN1010_PHY_ID:
472 1.1 dyoung phy_type = ixgbe_phy_tn;
473 1.1 dyoung break;
474 1.9 msaitoh case X550_PHY_ID2:
475 1.9 msaitoh case X550_PHY_ID3:
476 1.3 msaitoh case X540_PHY_ID:
477 1.1 dyoung phy_type = ixgbe_phy_aq;
478 1.1 dyoung break;
479 1.1 dyoung case QT2022_PHY_ID:
480 1.1 dyoung phy_type = ixgbe_phy_qt;
481 1.1 dyoung break;
482 1.1 dyoung case ATH_PHY_ID:
483 1.1 dyoung phy_type = ixgbe_phy_nl;
484 1.1 dyoung break;
485 1.7 msaitoh case X557_PHY_ID:
486 1.12 msaitoh case X557_PHY_ID2:
487 1.7 msaitoh phy_type = ixgbe_phy_x550em_ext_t;
488 1.7 msaitoh break;
489 1.12 msaitoh case IXGBE_M88E1500_E_PHY_ID:
490 1.12 msaitoh case IXGBE_M88E1543_E_PHY_ID:
491 1.12 msaitoh phy_type = ixgbe_phy_ext_1g_t;
492 1.12 msaitoh break;
493 1.1 dyoung default:
494 1.1 dyoung phy_type = ixgbe_phy_unknown;
495 1.1 dyoung break;
496 1.1 dyoung }
497 1.1 dyoung return phy_type;
498 1.1 dyoung }
499 1.1 dyoung
500 1.1 dyoung /**
501 1.1 dyoung * ixgbe_reset_phy_generic - Performs a PHY reset
502 1.1 dyoung * @hw: pointer to hardware structure
503 1.1 dyoung **/
504 1.1 dyoung s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
505 1.1 dyoung {
506 1.1 dyoung u32 i;
507 1.1 dyoung u16 ctrl = 0;
508 1.1 dyoung s32 status = IXGBE_SUCCESS;
509 1.1 dyoung
510 1.1 dyoung DEBUGFUNC("ixgbe_reset_phy_generic");
511 1.1 dyoung
512 1.1 dyoung if (hw->phy.type == ixgbe_phy_unknown)
513 1.1 dyoung status = ixgbe_identify_phy_generic(hw);
514 1.1 dyoung
515 1.1 dyoung if (status != IXGBE_SUCCESS || hw->phy.type == ixgbe_phy_none)
516 1.1 dyoung goto out;
517 1.1 dyoung
518 1.1 dyoung /* Don't reset PHY if it's shut down due to overtemp. */
519 1.1 dyoung if (!hw->phy.reset_if_overtemp &&
520 1.1 dyoung (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
521 1.1 dyoung goto out;
522 1.1 dyoung
523 1.7 msaitoh /* Blocked by MNG FW so bail */
524 1.7 msaitoh if (ixgbe_check_reset_blocked(hw))
525 1.7 msaitoh goto out;
526 1.7 msaitoh
527 1.1 dyoung /*
528 1.1 dyoung * Perform soft PHY reset to the PHY_XS.
529 1.1 dyoung * This will cause a soft reset to the PHY
530 1.1 dyoung */
531 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
532 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE,
533 1.3 msaitoh IXGBE_MDIO_PHY_XS_RESET);
534 1.1 dyoung
535 1.1 dyoung /*
536 1.1 dyoung * Poll for reset bit to self-clear indicating reset is complete.
537 1.1 dyoung * Some PHYs could take up to 3 seconds to complete and need about
538 1.1 dyoung * 1.7 usec delay after the reset is complete.
539 1.1 dyoung */
540 1.1 dyoung for (i = 0; i < 30; i++) {
541 1.1 dyoung msec_delay(100);
542 1.12 msaitoh if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
543 1.12 msaitoh status = hw->phy.ops.read_reg(hw,
544 1.12 msaitoh IXGBE_MDIO_TX_VENDOR_ALARMS_3,
545 1.12 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE,
546 1.12 msaitoh &ctrl);
547 1.12 msaitoh if (status != IXGBE_SUCCESS)
548 1.12 msaitoh return status;
549 1.12 msaitoh
550 1.12 msaitoh if (ctrl & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) {
551 1.12 msaitoh usec_delay(2);
552 1.12 msaitoh break;
553 1.12 msaitoh }
554 1.12 msaitoh } else {
555 1.12 msaitoh status = hw->phy.ops.read_reg(hw,
556 1.12 msaitoh IXGBE_MDIO_PHY_XS_CONTROL,
557 1.12 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE,
558 1.12 msaitoh &ctrl);
559 1.12 msaitoh if (status != IXGBE_SUCCESS)
560 1.12 msaitoh return status;
561 1.12 msaitoh
562 1.12 msaitoh if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
563 1.12 msaitoh usec_delay(2);
564 1.12 msaitoh break;
565 1.12 msaitoh }
566 1.1 dyoung }
567 1.1 dyoung }
568 1.1 dyoung
569 1.1 dyoung if (ctrl & IXGBE_MDIO_PHY_XS_RESET) {
570 1.1 dyoung status = IXGBE_ERR_RESET_FAILED;
571 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING,
572 1.6 msaitoh "PHY reset polling failed to complete.\n");
573 1.1 dyoung }
574 1.1 dyoung
575 1.1 dyoung out:
576 1.1 dyoung return status;
577 1.1 dyoung }
578 1.1 dyoung
579 1.1 dyoung /**
580 1.6 msaitoh * ixgbe_read_phy_mdi - Reads a value from a specified PHY register without
581 1.6 msaitoh * the SWFW lock
582 1.6 msaitoh * @hw: pointer to hardware structure
583 1.6 msaitoh * @reg_addr: 32 bit address of PHY register to read
584 1.6 msaitoh * @phy_data: Pointer to read data from PHY register
585 1.6 msaitoh **/
586 1.6 msaitoh s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
587 1.12 msaitoh u16 *phy_data)
588 1.6 msaitoh {
589 1.6 msaitoh u32 i, data, command;
590 1.6 msaitoh
591 1.6 msaitoh /* Setup and write the address cycle command */
592 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
593 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
594 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
595 1.6 msaitoh (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
596 1.6 msaitoh
597 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
598 1.6 msaitoh
599 1.6 msaitoh /*
600 1.6 msaitoh * Check every 10 usec to see if the address cycle completed.
601 1.6 msaitoh * The MDI Command bit will clear when the operation is
602 1.6 msaitoh * complete
603 1.6 msaitoh */
604 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
605 1.6 msaitoh usec_delay(10);
606 1.6 msaitoh
607 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA);
608 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
609 1.12 msaitoh break;
610 1.6 msaitoh }
611 1.6 msaitoh
612 1.6 msaitoh
613 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
614 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address command did not complete.\n");
615 1.12 msaitoh DEBUGOUT("PHY address command did not complete, returning IXGBE_ERR_PHY\n");
616 1.6 msaitoh return IXGBE_ERR_PHY;
617 1.6 msaitoh }
618 1.6 msaitoh
619 1.6 msaitoh /*
620 1.6 msaitoh * Address cycle complete, setup and write the read
621 1.6 msaitoh * command
622 1.6 msaitoh */
623 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
624 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
625 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
626 1.6 msaitoh (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND));
627 1.6 msaitoh
628 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
629 1.6 msaitoh
630 1.6 msaitoh /*
631 1.6 msaitoh * Check every 10 usec to see if the address cycle
632 1.6 msaitoh * completed. The MDI Command bit will clear when the
633 1.6 msaitoh * operation is complete
634 1.6 msaitoh */
635 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
636 1.6 msaitoh usec_delay(10);
637 1.6 msaitoh
638 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA);
639 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
640 1.6 msaitoh break;
641 1.6 msaitoh }
642 1.6 msaitoh
643 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
644 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY read command didn't complete\n");
645 1.12 msaitoh DEBUGOUT("PHY read command didn't complete, returning IXGBE_ERR_PHY\n");
646 1.6 msaitoh return IXGBE_ERR_PHY;
647 1.6 msaitoh }
648 1.6 msaitoh
649 1.6 msaitoh /*
650 1.6 msaitoh * Read operation is complete. Get the data
651 1.6 msaitoh * from MSRWD
652 1.6 msaitoh */
653 1.6 msaitoh data = IXGBE_READ_REG(hw, IXGBE_MSRWD);
654 1.6 msaitoh data >>= IXGBE_MSRWD_READ_DATA_SHIFT;
655 1.6 msaitoh *phy_data = (u16)(data);
656 1.6 msaitoh
657 1.6 msaitoh return IXGBE_SUCCESS;
658 1.6 msaitoh }
659 1.6 msaitoh
660 1.6 msaitoh /**
661 1.1 dyoung * ixgbe_read_phy_reg_generic - Reads a value from a specified PHY register
662 1.6 msaitoh * using the SWFW lock - this function is needed in most cases
663 1.1 dyoung * @hw: pointer to hardware structure
664 1.1 dyoung * @reg_addr: 32 bit address of PHY register to read
665 1.1 dyoung * @phy_data: Pointer to read data from PHY register
666 1.1 dyoung **/
667 1.1 dyoung s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
668 1.3 msaitoh u32 device_type, u16 *phy_data)
669 1.1 dyoung {
670 1.6 msaitoh s32 status;
671 1.7 msaitoh u32 gssr = hw->phy.phy_semaphore_mask;
672 1.1 dyoung
673 1.1 dyoung DEBUGFUNC("ixgbe_read_phy_reg_generic");
674 1.1 dyoung
675 1.12 msaitoh if (hw->mac.ops.acquire_swfw_sync(hw, gssr))
676 1.12 msaitoh return IXGBE_ERR_SWFW_SYNC;
677 1.12 msaitoh
678 1.12 msaitoh status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
679 1.12 msaitoh
680 1.12 msaitoh hw->mac.ops.release_swfw_sync(hw, gssr);
681 1.6 msaitoh
682 1.6 msaitoh return status;
683 1.6 msaitoh }
684 1.6 msaitoh
685 1.6 msaitoh /**
686 1.6 msaitoh * ixgbe_write_phy_reg_mdi - Writes a value to specified PHY register
687 1.6 msaitoh * without SWFW lock
688 1.6 msaitoh * @hw: pointer to hardware structure
689 1.6 msaitoh * @reg_addr: 32 bit PHY register to write
690 1.6 msaitoh * @device_type: 5 bit device type
691 1.6 msaitoh * @phy_data: Data to write to the PHY register
692 1.6 msaitoh **/
693 1.6 msaitoh s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr,
694 1.6 msaitoh u32 device_type, u16 phy_data)
695 1.6 msaitoh {
696 1.6 msaitoh u32 i, command;
697 1.1 dyoung
698 1.6 msaitoh /* Put the data in the MDI single read and write data register*/
699 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);
700 1.1 dyoung
701 1.6 msaitoh /* Setup and write the address cycle command */
702 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
703 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
704 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
705 1.6 msaitoh (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
706 1.1 dyoung
707 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
708 1.1 dyoung
709 1.6 msaitoh /*
710 1.6 msaitoh * Check every 10 usec to see if the address cycle completed.
711 1.6 msaitoh * The MDI Command bit will clear when the operation is
712 1.6 msaitoh * complete
713 1.6 msaitoh */
714 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
715 1.6 msaitoh usec_delay(10);
716 1.1 dyoung
717 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA);
718 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
719 1.6 msaitoh break;
720 1.6 msaitoh }
721 1.1 dyoung
722 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
723 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address cmd didn't complete\n");
724 1.6 msaitoh return IXGBE_ERR_PHY;
725 1.6 msaitoh }
726 1.1 dyoung
727 1.6 msaitoh /*
728 1.6 msaitoh * Address cycle complete, setup and write the write
729 1.6 msaitoh * command
730 1.6 msaitoh */
731 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
732 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
733 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
734 1.6 msaitoh (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND));
735 1.1 dyoung
736 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
737 1.1 dyoung
738 1.6 msaitoh /*
739 1.6 msaitoh * Check every 10 usec to see if the address cycle
740 1.6 msaitoh * completed. The MDI Command bit will clear when the
741 1.6 msaitoh * operation is complete
742 1.6 msaitoh */
743 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
744 1.6 msaitoh usec_delay(10);
745 1.1 dyoung
746 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA);
747 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
748 1.6 msaitoh break;
749 1.6 msaitoh }
750 1.1 dyoung
751 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
752 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY write cmd didn't complete\n");
753 1.6 msaitoh return IXGBE_ERR_PHY;
754 1.1 dyoung }
755 1.1 dyoung
756 1.6 msaitoh return IXGBE_SUCCESS;
757 1.1 dyoung }
758 1.1 dyoung
759 1.1 dyoung /**
760 1.1 dyoung * ixgbe_write_phy_reg_generic - Writes a value to specified PHY register
761 1.6 msaitoh * using SWFW lock- this function is needed in most cases
762 1.1 dyoung * @hw: pointer to hardware structure
763 1.1 dyoung * @reg_addr: 32 bit PHY register to write
764 1.1 dyoung * @device_type: 5 bit device type
765 1.1 dyoung * @phy_data: Data to write to the PHY register
766 1.1 dyoung **/
767 1.1 dyoung s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
768 1.3 msaitoh u32 device_type, u16 phy_data)
769 1.1 dyoung {
770 1.6 msaitoh s32 status;
771 1.7 msaitoh u32 gssr = hw->phy.phy_semaphore_mask;
772 1.1 dyoung
773 1.1 dyoung DEBUGFUNC("ixgbe_write_phy_reg_generic");
774 1.1 dyoung
775 1.6 msaitoh if (hw->mac.ops.acquire_swfw_sync(hw, gssr) == IXGBE_SUCCESS) {
776 1.12 msaitoh status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type,
777 1.6 msaitoh phy_data);
778 1.6 msaitoh hw->mac.ops.release_swfw_sync(hw, gssr);
779 1.6 msaitoh } else {
780 1.1 dyoung status = IXGBE_ERR_SWFW_SYNC;
781 1.1 dyoung }
782 1.1 dyoung
783 1.1 dyoung return status;
784 1.1 dyoung }
785 1.1 dyoung
786 1.1 dyoung /**
787 1.7 msaitoh * ixgbe_setup_phy_link_generic - Set and restart auto-neg
788 1.1 dyoung * @hw: pointer to hardware structure
789 1.1 dyoung *
790 1.7 msaitoh * Restart auto-negotiation and PHY and waits for completion.
791 1.1 dyoung **/
792 1.1 dyoung s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
793 1.1 dyoung {
794 1.1 dyoung s32 status = IXGBE_SUCCESS;
795 1.1 dyoung u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
796 1.1 dyoung bool autoneg = FALSE;
797 1.1 dyoung ixgbe_link_speed speed;
798 1.1 dyoung
799 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_generic");
800 1.1 dyoung
801 1.1 dyoung ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
802 1.1 dyoung
803 1.12 msaitoh /* Set or unset auto-negotiation 10G advertisement */
804 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
805 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
806 1.12 msaitoh &autoneg_reg);
807 1.12 msaitoh
808 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
809 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) &&
810 1.12 msaitoh (speed & IXGBE_LINK_SPEED_10GB_FULL))
811 1.12 msaitoh autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
812 1.12 msaitoh
813 1.12 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
814 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
815 1.12 msaitoh autoneg_reg);
816 1.12 msaitoh
817 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
818 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
819 1.12 msaitoh &autoneg_reg);
820 1.1 dyoung
821 1.7 msaitoh if (hw->mac.type == ixgbe_mac_X550) {
822 1.12 msaitoh /* Set or unset auto-negotiation 5G advertisement */
823 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_5GBASE_T_ADVERTISE;
824 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_5GB_FULL) &&
825 1.12 msaitoh (speed & IXGBE_LINK_SPEED_5GB_FULL))
826 1.12 msaitoh autoneg_reg |= IXGBE_MII_5GBASE_T_ADVERTISE;
827 1.12 msaitoh
828 1.12 msaitoh /* Set or unset auto-negotiation 2.5G advertisement */
829 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_2_5GBASE_T_ADVERTISE;
830 1.12 msaitoh if ((hw->phy.autoneg_advertised &
831 1.12 msaitoh IXGBE_LINK_SPEED_2_5GB_FULL) &&
832 1.12 msaitoh (speed & IXGBE_LINK_SPEED_2_5GB_FULL))
833 1.12 msaitoh autoneg_reg |= IXGBE_MII_2_5GBASE_T_ADVERTISE;
834 1.12 msaitoh }
835 1.12 msaitoh
836 1.12 msaitoh /* Set or unset auto-negotiation 1G advertisement */
837 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
838 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) &&
839 1.12 msaitoh (speed & IXGBE_LINK_SPEED_1GB_FULL))
840 1.12 msaitoh autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
841 1.12 msaitoh
842 1.12 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
843 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
844 1.12 msaitoh autoneg_reg);
845 1.12 msaitoh
846 1.12 msaitoh /* Set or unset auto-negotiation 100M advertisement */
847 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
848 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
849 1.12 msaitoh &autoneg_reg);
850 1.12 msaitoh
851 1.12 msaitoh autoneg_reg &= ~(IXGBE_MII_100BASE_T_ADVERTISE |
852 1.12 msaitoh IXGBE_MII_100BASE_T_ADVERTISE_HALF);
853 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) &&
854 1.12 msaitoh (speed & IXGBE_LINK_SPEED_100_FULL))
855 1.12 msaitoh autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
856 1.12 msaitoh
857 1.12 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
858 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
859 1.12 msaitoh autoneg_reg);
860 1.1 dyoung
861 1.13 msaitoh if (hw->phy.autoneg_advertised == IXGBE_LINK_SPEED_100_FULL) {
862 1.13 msaitoh u16 ctrl;
863 1.13 msaitoh
864 1.13 msaitoh /* Force 100Mbps */
865 1.13 msaitoh hw->phy.ops.read_reg(hw, MDIO_PMAPMD_CTRL1, MDIO_MMD_PMAPMD,
866 1.13 msaitoh &ctrl);
867 1.13 msaitoh ctrl &= ~PMAPMD_CTRL1_SPEED_MASK;
868 1.13 msaitoh ctrl |= PMAPMD_CTRL1_SPEED_100;
869 1.13 msaitoh hw->phy.ops.write_reg(hw, MDIO_PMAPMD_CTRL1,MDIO_MMD_PMAPMD,
870 1.13 msaitoh ctrl);
871 1.7 msaitoh
872 1.13 msaitoh /* Don't use auto-nego for 100Mbps */
873 1.13 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
874 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
875 1.1 dyoung
876 1.13 msaitoh autoneg_reg &= ~AN_CTRL1_AUTOEN;
877 1.1 dyoung
878 1.13 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
879 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
880 1.13 msaitoh } else {
881 1.13 msaitoh /* Blocked by MNG FW so don't reset PHY */
882 1.13 msaitoh if (ixgbe_check_reset_blocked(hw))
883 1.13 msaitoh return status;
884 1.13 msaitoh
885 1.13 msaitoh /* Restart PHY auto-negotiation. */
886 1.13 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
887 1.13 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
888 1.13 msaitoh
889 1.13 msaitoh autoneg_reg |= IXGBE_MII_RESTART | AN_CTRL1_AUTOEN;
890 1.13 msaitoh
891 1.13 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
892 1.13 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
893 1.13 msaitoh }
894 1.1 dyoung
895 1.1 dyoung return status;
896 1.1 dyoung }
897 1.1 dyoung
898 1.1 dyoung /**
899 1.1 dyoung * ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
900 1.1 dyoung * @hw: pointer to hardware structure
901 1.1 dyoung * @speed: new link speed
902 1.1 dyoung **/
903 1.1 dyoung s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
904 1.3 msaitoh ixgbe_link_speed speed,
905 1.3 msaitoh bool autoneg_wait_to_complete)
906 1.1 dyoung {
907 1.5 msaitoh UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
908 1.1 dyoung
909 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
910 1.1 dyoung
911 1.1 dyoung /*
912 1.1 dyoung * Clear autoneg_advertised and set new values based on input link
913 1.1 dyoung * speed.
914 1.1 dyoung */
915 1.1 dyoung hw->phy.autoneg_advertised = 0;
916 1.1 dyoung
917 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL)
918 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
919 1.1 dyoung
920 1.7 msaitoh if (speed & IXGBE_LINK_SPEED_5GB_FULL)
921 1.7 msaitoh hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_5GB_FULL;
922 1.7 msaitoh
923 1.7 msaitoh if (speed & IXGBE_LINK_SPEED_2_5GB_FULL)
924 1.7 msaitoh hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_2_5GB_FULL;
925 1.7 msaitoh
926 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL)
927 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
928 1.1 dyoung
929 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL)
930 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL;
931 1.1 dyoung
932 1.12 msaitoh if (speed & IXGBE_LINK_SPEED_10_FULL)
933 1.12 msaitoh hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10_FULL;
934 1.12 msaitoh
935 1.1 dyoung /* Setup link based on the new speed settings */
936 1.9 msaitoh ixgbe_setup_phy_link(hw);
937 1.1 dyoung
938 1.1 dyoung return IXGBE_SUCCESS;
939 1.1 dyoung }
940 1.1 dyoung
941 1.1 dyoung /**
942 1.9 msaitoh * ixgbe_get_copper_speeds_supported - Get copper link speeds from phy
943 1.9 msaitoh * @hw: pointer to hardware structure
944 1.9 msaitoh *
945 1.9 msaitoh * Determines the supported link capabilities by reading the PHY auto
946 1.9 msaitoh * negotiation register.
947 1.9 msaitoh **/
948 1.9 msaitoh static s32 ixgbe_get_copper_speeds_supported(struct ixgbe_hw *hw)
949 1.9 msaitoh {
950 1.9 msaitoh s32 status;
951 1.9 msaitoh u16 speed_ability;
952 1.9 msaitoh
953 1.9 msaitoh status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY,
954 1.9 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE,
955 1.9 msaitoh &speed_ability);
956 1.9 msaitoh if (status)
957 1.9 msaitoh return status;
958 1.9 msaitoh
959 1.9 msaitoh if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G)
960 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_10GB_FULL;
961 1.9 msaitoh if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G)
962 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_1GB_FULL;
963 1.9 msaitoh if (speed_ability & IXGBE_MDIO_PHY_SPEED_100M)
964 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_100_FULL;
965 1.9 msaitoh
966 1.9 msaitoh switch (hw->mac.type) {
967 1.9 msaitoh case ixgbe_mac_X550:
968 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_2_5GB_FULL;
969 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_5GB_FULL;
970 1.9 msaitoh break;
971 1.9 msaitoh case ixgbe_mac_X550EM_x:
972 1.12 msaitoh case ixgbe_mac_X550EM_a:
973 1.9 msaitoh hw->phy.speeds_supported &= ~IXGBE_LINK_SPEED_100_FULL;
974 1.9 msaitoh break;
975 1.9 msaitoh default:
976 1.9 msaitoh break;
977 1.9 msaitoh }
978 1.9 msaitoh
979 1.9 msaitoh return status;
980 1.9 msaitoh }
981 1.9 msaitoh
982 1.9 msaitoh /**
983 1.1 dyoung * ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
984 1.1 dyoung * @hw: pointer to hardware structure
985 1.1 dyoung * @speed: pointer to link speed
986 1.1 dyoung * @autoneg: boolean auto-negotiation value
987 1.1 dyoung **/
988 1.1 dyoung s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
989 1.3 msaitoh ixgbe_link_speed *speed,
990 1.3 msaitoh bool *autoneg)
991 1.1 dyoung {
992 1.9 msaitoh s32 status = IXGBE_SUCCESS;
993 1.1 dyoung
994 1.1 dyoung DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic");
995 1.1 dyoung
996 1.1 dyoung *autoneg = TRUE;
997 1.9 msaitoh if (!hw->phy.speeds_supported)
998 1.9 msaitoh status = ixgbe_get_copper_speeds_supported(hw);
999 1.1 dyoung
1000 1.9 msaitoh *speed = hw->phy.speeds_supported;
1001 1.1 dyoung return status;
1002 1.1 dyoung }
1003 1.1 dyoung
1004 1.1 dyoung /**
1005 1.1 dyoung * ixgbe_check_phy_link_tnx - Determine link and speed status
1006 1.1 dyoung * @hw: pointer to hardware structure
1007 1.1 dyoung *
1008 1.1 dyoung * Reads the VS1 register to determine if link is up and the current speed for
1009 1.1 dyoung * the PHY.
1010 1.1 dyoung **/
1011 1.1 dyoung s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
1012 1.3 msaitoh bool *link_up)
1013 1.1 dyoung {
1014 1.1 dyoung s32 status = IXGBE_SUCCESS;
1015 1.1 dyoung u32 time_out;
1016 1.1 dyoung u32 max_time_out = 10;
1017 1.1 dyoung u16 phy_link = 0;
1018 1.1 dyoung u16 phy_speed = 0;
1019 1.1 dyoung u16 phy_data = 0;
1020 1.1 dyoung
1021 1.1 dyoung DEBUGFUNC("ixgbe_check_phy_link_tnx");
1022 1.1 dyoung
1023 1.1 dyoung /* Initialize speed and link to default case */
1024 1.1 dyoung *link_up = FALSE;
1025 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL;
1026 1.1 dyoung
1027 1.1 dyoung /*
1028 1.1 dyoung * Check current speed and link status of the PHY register.
1029 1.1 dyoung * This is a vendor specific register and may have to
1030 1.1 dyoung * be changed for other copper PHYs.
1031 1.1 dyoung */
1032 1.1 dyoung for (time_out = 0; time_out < max_time_out; time_out++) {
1033 1.1 dyoung usec_delay(10);
1034 1.1 dyoung status = hw->phy.ops.read_reg(hw,
1035 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,
1036 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1037 1.3 msaitoh &phy_data);
1038 1.3 msaitoh phy_link = phy_data & IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;
1039 1.1 dyoung phy_speed = phy_data &
1040 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;
1041 1.1 dyoung if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {
1042 1.1 dyoung *link_up = TRUE;
1043 1.1 dyoung if (phy_speed ==
1044 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)
1045 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL;
1046 1.1 dyoung break;
1047 1.1 dyoung }
1048 1.1 dyoung }
1049 1.1 dyoung
1050 1.1 dyoung return status;
1051 1.1 dyoung }
1052 1.1 dyoung
1053 1.1 dyoung /**
1054 1.7 msaitoh * ixgbe_setup_phy_link_tnx - Set and restart auto-neg
1055 1.1 dyoung * @hw: pointer to hardware structure
1056 1.1 dyoung *
1057 1.7 msaitoh * Restart auto-negotiation and PHY and waits for completion.
1058 1.1 dyoung **/
1059 1.1 dyoung s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
1060 1.1 dyoung {
1061 1.1 dyoung s32 status = IXGBE_SUCCESS;
1062 1.1 dyoung u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
1063 1.1 dyoung bool autoneg = FALSE;
1064 1.1 dyoung ixgbe_link_speed speed;
1065 1.1 dyoung
1066 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_tnx");
1067 1.1 dyoung
1068 1.1 dyoung ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
1069 1.1 dyoung
1070 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
1071 1.1 dyoung /* Set or unset auto-negotiation 10G advertisement */
1072 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
1073 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1074 1.3 msaitoh &autoneg_reg);
1075 1.1 dyoung
1076 1.1 dyoung autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
1077 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
1078 1.1 dyoung autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
1079 1.1 dyoung
1080 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
1081 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1082 1.3 msaitoh autoneg_reg);
1083 1.1 dyoung }
1084 1.1 dyoung
1085 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
1086 1.1 dyoung /* Set or unset auto-negotiation 1G advertisement */
1087 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
1088 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1089 1.3 msaitoh &autoneg_reg);
1090 1.1 dyoung
1091 1.1 dyoung autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
1092 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
1093 1.1 dyoung autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
1094 1.1 dyoung
1095 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
1096 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1097 1.3 msaitoh autoneg_reg);
1098 1.1 dyoung }
1099 1.1 dyoung
1100 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL) {
1101 1.1 dyoung /* Set or unset auto-negotiation 100M advertisement */
1102 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
1103 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1104 1.3 msaitoh &autoneg_reg);
1105 1.1 dyoung
1106 1.1 dyoung autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
1107 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
1108 1.1 dyoung autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
1109 1.1 dyoung
1110 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
1111 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1112 1.3 msaitoh autoneg_reg);
1113 1.1 dyoung }
1114 1.1 dyoung
1115 1.7 msaitoh /* Blocked by MNG FW so don't reset PHY */
1116 1.7 msaitoh if (ixgbe_check_reset_blocked(hw))
1117 1.7 msaitoh return status;
1118 1.7 msaitoh
1119 1.7 msaitoh /* Restart PHY auto-negotiation. */
1120 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
1121 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
1122 1.1 dyoung
1123 1.1 dyoung autoneg_reg |= IXGBE_MII_RESTART;
1124 1.1 dyoung
1125 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
1126 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
1127 1.1 dyoung
1128 1.1 dyoung return status;
1129 1.1 dyoung }
1130 1.1 dyoung
1131 1.1 dyoung /**
1132 1.1 dyoung * ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
1133 1.1 dyoung * @hw: pointer to hardware structure
1134 1.1 dyoung * @firmware_version: pointer to the PHY Firmware Version
1135 1.1 dyoung **/
1136 1.1 dyoung s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
1137 1.3 msaitoh u16 *firmware_version)
1138 1.1 dyoung {
1139 1.7 msaitoh s32 status;
1140 1.1 dyoung
1141 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx");
1142 1.1 dyoung
1143 1.1 dyoung status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
1144 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1145 1.3 msaitoh firmware_version);
1146 1.1 dyoung
1147 1.1 dyoung return status;
1148 1.1 dyoung }
1149 1.1 dyoung
1150 1.1 dyoung /**
1151 1.1 dyoung * ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version
1152 1.1 dyoung * @hw: pointer to hardware structure
1153 1.1 dyoung * @firmware_version: pointer to the PHY Firmware Version
1154 1.1 dyoung **/
1155 1.1 dyoung s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
1156 1.3 msaitoh u16 *firmware_version)
1157 1.1 dyoung {
1158 1.7 msaitoh s32 status;
1159 1.1 dyoung
1160 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_firmware_version_generic");
1161 1.1 dyoung
1162 1.1 dyoung status = hw->phy.ops.read_reg(hw, AQ_FW_REV,
1163 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1164 1.3 msaitoh firmware_version);
1165 1.1 dyoung
1166 1.1 dyoung return status;
1167 1.1 dyoung }
1168 1.1 dyoung
1169 1.1 dyoung /**
1170 1.1 dyoung * ixgbe_reset_phy_nl - Performs a PHY reset
1171 1.1 dyoung * @hw: pointer to hardware structure
1172 1.1 dyoung **/
1173 1.1 dyoung s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
1174 1.1 dyoung {
1175 1.1 dyoung u16 phy_offset, control, eword, edata, block_crc;
1176 1.1 dyoung bool end_data = FALSE;
1177 1.1 dyoung u16 list_offset, data_offset;
1178 1.1 dyoung u16 phy_data = 0;
1179 1.1 dyoung s32 ret_val = IXGBE_SUCCESS;
1180 1.1 dyoung u32 i;
1181 1.1 dyoung
1182 1.1 dyoung DEBUGFUNC("ixgbe_reset_phy_nl");
1183 1.1 dyoung
1184 1.7 msaitoh /* Blocked by MNG FW so bail */
1185 1.7 msaitoh if (ixgbe_check_reset_blocked(hw))
1186 1.7 msaitoh goto out;
1187 1.7 msaitoh
1188 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
1189 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
1190 1.1 dyoung
1191 1.1 dyoung /* reset the PHY and poll for completion */
1192 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
1193 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE,
1194 1.3 msaitoh (phy_data | IXGBE_MDIO_PHY_XS_RESET));
1195 1.1 dyoung
1196 1.1 dyoung for (i = 0; i < 100; i++) {
1197 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
1198 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
1199 1.1 dyoung if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0)
1200 1.1 dyoung break;
1201 1.1 dyoung msec_delay(10);
1202 1.1 dyoung }
1203 1.1 dyoung
1204 1.1 dyoung if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) {
1205 1.1 dyoung DEBUGOUT("PHY reset did not complete.\n");
1206 1.1 dyoung ret_val = IXGBE_ERR_PHY;
1207 1.1 dyoung goto out;
1208 1.1 dyoung }
1209 1.1 dyoung
1210 1.1 dyoung /* Get init offsets */
1211 1.1 dyoung ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
1212 1.3 msaitoh &data_offset);
1213 1.1 dyoung if (ret_val != IXGBE_SUCCESS)
1214 1.1 dyoung goto out;
1215 1.1 dyoung
1216 1.1 dyoung ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc);
1217 1.1 dyoung data_offset++;
1218 1.1 dyoung while (!end_data) {
1219 1.1 dyoung /*
1220 1.1 dyoung * Read control word from PHY init contents offset
1221 1.1 dyoung */
1222 1.1 dyoung ret_val = hw->eeprom.ops.read(hw, data_offset, &eword);
1223 1.6 msaitoh if (ret_val)
1224 1.6 msaitoh goto err_eeprom;
1225 1.1 dyoung control = (eword & IXGBE_CONTROL_MASK_NL) >>
1226 1.3 msaitoh IXGBE_CONTROL_SHIFT_NL;
1227 1.1 dyoung edata = eword & IXGBE_DATA_MASK_NL;
1228 1.1 dyoung switch (control) {
1229 1.1 dyoung case IXGBE_DELAY_NL:
1230 1.1 dyoung data_offset++;
1231 1.1 dyoung DEBUGOUT1("DELAY: %d MS\n", edata);
1232 1.1 dyoung msec_delay(edata);
1233 1.1 dyoung break;
1234 1.1 dyoung case IXGBE_DATA_NL:
1235 1.3 msaitoh DEBUGOUT("DATA:\n");
1236 1.1 dyoung data_offset++;
1237 1.6 msaitoh ret_val = hw->eeprom.ops.read(hw, data_offset,
1238 1.6 msaitoh &phy_offset);
1239 1.6 msaitoh if (ret_val)
1240 1.6 msaitoh goto err_eeprom;
1241 1.6 msaitoh data_offset++;
1242 1.1 dyoung for (i = 0; i < edata; i++) {
1243 1.6 msaitoh ret_val = hw->eeprom.ops.read(hw, data_offset,
1244 1.6 msaitoh &eword);
1245 1.6 msaitoh if (ret_val)
1246 1.6 msaitoh goto err_eeprom;
1247 1.1 dyoung hw->phy.ops.write_reg(hw, phy_offset,
1248 1.3 msaitoh IXGBE_TWINAX_DEV, eword);
1249 1.1 dyoung DEBUGOUT2("Wrote %4.4x to %4.4x\n", eword,
1250 1.3 msaitoh phy_offset);
1251 1.1 dyoung data_offset++;
1252 1.1 dyoung phy_offset++;
1253 1.1 dyoung }
1254 1.1 dyoung break;
1255 1.1 dyoung case IXGBE_CONTROL_NL:
1256 1.1 dyoung data_offset++;
1257 1.3 msaitoh DEBUGOUT("CONTROL:\n");
1258 1.1 dyoung if (edata == IXGBE_CONTROL_EOL_NL) {
1259 1.1 dyoung DEBUGOUT("EOL\n");
1260 1.1 dyoung end_data = TRUE;
1261 1.1 dyoung } else if (edata == IXGBE_CONTROL_SOL_NL) {
1262 1.1 dyoung DEBUGOUT("SOL\n");
1263 1.1 dyoung } else {
1264 1.1 dyoung DEBUGOUT("Bad control value\n");
1265 1.1 dyoung ret_val = IXGBE_ERR_PHY;
1266 1.1 dyoung goto out;
1267 1.1 dyoung }
1268 1.1 dyoung break;
1269 1.1 dyoung default:
1270 1.1 dyoung DEBUGOUT("Bad control type\n");
1271 1.1 dyoung ret_val = IXGBE_ERR_PHY;
1272 1.1 dyoung goto out;
1273 1.1 dyoung }
1274 1.1 dyoung }
1275 1.1 dyoung
1276 1.1 dyoung out:
1277 1.1 dyoung return ret_val;
1278 1.6 msaitoh
1279 1.6 msaitoh err_eeprom:
1280 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
1281 1.6 msaitoh "eeprom read at offset %d failed", data_offset);
1282 1.6 msaitoh return IXGBE_ERR_PHY;
1283 1.1 dyoung }
1284 1.1 dyoung
1285 1.1 dyoung /**
1286 1.3 msaitoh * ixgbe_identify_module_generic - Identifies module type
1287 1.3 msaitoh * @hw: pointer to hardware structure
1288 1.3 msaitoh *
1289 1.3 msaitoh * Determines HW type and calls appropriate function.
1290 1.3 msaitoh **/
1291 1.3 msaitoh s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw)
1292 1.3 msaitoh {
1293 1.3 msaitoh s32 status = IXGBE_ERR_SFP_NOT_PRESENT;
1294 1.3 msaitoh
1295 1.3 msaitoh DEBUGFUNC("ixgbe_identify_module_generic");
1296 1.3 msaitoh
1297 1.3 msaitoh switch (hw->mac.ops.get_media_type(hw)) {
1298 1.3 msaitoh case ixgbe_media_type_fiber:
1299 1.3 msaitoh status = ixgbe_identify_sfp_module_generic(hw);
1300 1.3 msaitoh break;
1301 1.3 msaitoh
1302 1.7 msaitoh case ixgbe_media_type_fiber_qsfp:
1303 1.7 msaitoh status = ixgbe_identify_qsfp_module_generic(hw);
1304 1.7 msaitoh break;
1305 1.3 msaitoh
1306 1.3 msaitoh default:
1307 1.3 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1308 1.3 msaitoh status = IXGBE_ERR_SFP_NOT_PRESENT;
1309 1.3 msaitoh break;
1310 1.3 msaitoh }
1311 1.3 msaitoh
1312 1.3 msaitoh return status;
1313 1.3 msaitoh }
1314 1.3 msaitoh
1315 1.3 msaitoh /**
1316 1.1 dyoung * ixgbe_identify_sfp_module_generic - Identifies SFP modules
1317 1.1 dyoung * @hw: pointer to hardware structure
1318 1.1 dyoung *
1319 1.1 dyoung * Searches for and identifies the SFP module and assigns appropriate PHY type.
1320 1.1 dyoung **/
1321 1.1 dyoung s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
1322 1.1 dyoung {
1323 1.1 dyoung s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
1324 1.1 dyoung u32 vendor_oui = 0;
1325 1.1 dyoung enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
1326 1.1 dyoung u8 identifier = 0;
1327 1.1 dyoung u8 comp_codes_1g = 0;
1328 1.1 dyoung u8 comp_codes_10g = 0;
1329 1.1 dyoung u8 oui_bytes[3] = {0, 0, 0};
1330 1.1 dyoung u8 cable_tech = 0;
1331 1.1 dyoung u8 cable_spec = 0;
1332 1.1 dyoung u16 enforce_sfp = 0;
1333 1.1 dyoung
1334 1.1 dyoung DEBUGFUNC("ixgbe_identify_sfp_module_generic");
1335 1.1 dyoung
1336 1.1 dyoung if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
1337 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1338 1.1 dyoung status = IXGBE_ERR_SFP_NOT_PRESENT;
1339 1.1 dyoung goto out;
1340 1.1 dyoung }
1341 1.1 dyoung
1342 1.7 msaitoh /* LAN ID is needed for I2C access */
1343 1.7 msaitoh hw->mac.ops.set_lan_id(hw);
1344 1.7 msaitoh
1345 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1346 1.3 msaitoh IXGBE_SFF_IDENTIFIER,
1347 1.3 msaitoh &identifier);
1348 1.1 dyoung
1349 1.5 msaitoh if (status != IXGBE_SUCCESS)
1350 1.1 dyoung goto err_read_i2c_eeprom;
1351 1.1 dyoung
1352 1.1 dyoung if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
1353 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_unsupported;
1354 1.1 dyoung status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1355 1.1 dyoung } else {
1356 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1357 1.3 msaitoh IXGBE_SFF_1GBE_COMP_CODES,
1358 1.3 msaitoh &comp_codes_1g);
1359 1.1 dyoung
1360 1.5 msaitoh if (status != IXGBE_SUCCESS)
1361 1.1 dyoung goto err_read_i2c_eeprom;
1362 1.1 dyoung
1363 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1364 1.3 msaitoh IXGBE_SFF_10GBE_COMP_CODES,
1365 1.3 msaitoh &comp_codes_10g);
1366 1.1 dyoung
1367 1.5 msaitoh if (status != IXGBE_SUCCESS)
1368 1.1 dyoung goto err_read_i2c_eeprom;
1369 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1370 1.3 msaitoh IXGBE_SFF_CABLE_TECHNOLOGY,
1371 1.3 msaitoh &cable_tech);
1372 1.1 dyoung
1373 1.5 msaitoh if (status != IXGBE_SUCCESS)
1374 1.1 dyoung goto err_read_i2c_eeprom;
1375 1.1 dyoung
1376 1.1 dyoung /* ID Module
1377 1.1 dyoung * =========
1378 1.1 dyoung * 0 SFP_DA_CU
1379 1.1 dyoung * 1 SFP_SR
1380 1.1 dyoung * 2 SFP_LR
1381 1.1 dyoung * 3 SFP_DA_CORE0 - 82599-specific
1382 1.1 dyoung * 4 SFP_DA_CORE1 - 82599-specific
1383 1.1 dyoung * 5 SFP_SR/LR_CORE0 - 82599-specific
1384 1.1 dyoung * 6 SFP_SR/LR_CORE1 - 82599-specific
1385 1.1 dyoung * 7 SFP_act_lmt_DA_CORE0 - 82599-specific
1386 1.1 dyoung * 8 SFP_act_lmt_DA_CORE1 - 82599-specific
1387 1.1 dyoung * 9 SFP_1g_cu_CORE0 - 82599-specific
1388 1.1 dyoung * 10 SFP_1g_cu_CORE1 - 82599-specific
1389 1.4 msaitoh * 11 SFP_1g_sx_CORE0 - 82599-specific
1390 1.4 msaitoh * 12 SFP_1g_sx_CORE1 - 82599-specific
1391 1.1 dyoung */
1392 1.1 dyoung if (hw->mac.type == ixgbe_mac_82598EB) {
1393 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1394 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
1395 1.1 dyoung else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
1396 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_sr;
1397 1.1 dyoung else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
1398 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_lr;
1399 1.1 dyoung else
1400 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_unknown;
1401 1.7 msaitoh } else {
1402 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
1403 1.1 dyoung if (hw->bus.lan_id == 0)
1404 1.1 dyoung hw->phy.sfp_type =
1405 1.3 msaitoh ixgbe_sfp_type_da_cu_core0;
1406 1.1 dyoung else
1407 1.1 dyoung hw->phy.sfp_type =
1408 1.3 msaitoh ixgbe_sfp_type_da_cu_core1;
1409 1.1 dyoung } else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
1410 1.1 dyoung hw->phy.ops.read_i2c_eeprom(
1411 1.1 dyoung hw, IXGBE_SFF_CABLE_SPEC_COMP,
1412 1.1 dyoung &cable_spec);
1413 1.1 dyoung if (cable_spec &
1414 1.1 dyoung IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
1415 1.1 dyoung if (hw->bus.lan_id == 0)
1416 1.1 dyoung hw->phy.sfp_type =
1417 1.1 dyoung ixgbe_sfp_type_da_act_lmt_core0;
1418 1.1 dyoung else
1419 1.1 dyoung hw->phy.sfp_type =
1420 1.1 dyoung ixgbe_sfp_type_da_act_lmt_core1;
1421 1.1 dyoung } else {
1422 1.1 dyoung hw->phy.sfp_type =
1423 1.3 msaitoh ixgbe_sfp_type_unknown;
1424 1.1 dyoung }
1425 1.1 dyoung } else if (comp_codes_10g &
1426 1.1 dyoung (IXGBE_SFF_10GBASESR_CAPABLE |
1427 1.1 dyoung IXGBE_SFF_10GBASELR_CAPABLE)) {
1428 1.1 dyoung if (hw->bus.lan_id == 0)
1429 1.1 dyoung hw->phy.sfp_type =
1430 1.3 msaitoh ixgbe_sfp_type_srlr_core0;
1431 1.1 dyoung else
1432 1.1 dyoung hw->phy.sfp_type =
1433 1.3 msaitoh ixgbe_sfp_type_srlr_core1;
1434 1.1 dyoung } else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
1435 1.1 dyoung if (hw->bus.lan_id == 0)
1436 1.1 dyoung hw->phy.sfp_type =
1437 1.1 dyoung ixgbe_sfp_type_1g_cu_core0;
1438 1.1 dyoung else
1439 1.1 dyoung hw->phy.sfp_type =
1440 1.1 dyoung ixgbe_sfp_type_1g_cu_core1;
1441 1.4 msaitoh } else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) {
1442 1.4 msaitoh if (hw->bus.lan_id == 0)
1443 1.4 msaitoh hw->phy.sfp_type =
1444 1.4 msaitoh ixgbe_sfp_type_1g_sx_core0;
1445 1.4 msaitoh else
1446 1.4 msaitoh hw->phy.sfp_type =
1447 1.4 msaitoh ixgbe_sfp_type_1g_sx_core1;
1448 1.8 msaitoh } else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) {
1449 1.8 msaitoh if (hw->bus.lan_id == 0)
1450 1.8 msaitoh hw->phy.sfp_type =
1451 1.8 msaitoh ixgbe_sfp_type_1g_lx_core0;
1452 1.8 msaitoh else
1453 1.8 msaitoh hw->phy.sfp_type =
1454 1.8 msaitoh ixgbe_sfp_type_1g_lx_core1;
1455 1.1 dyoung } else {
1456 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_unknown;
1457 1.1 dyoung }
1458 1.1 dyoung }
1459 1.1 dyoung
1460 1.1 dyoung if (hw->phy.sfp_type != stored_sfp_type)
1461 1.1 dyoung hw->phy.sfp_setup_needed = TRUE;
1462 1.1 dyoung
1463 1.1 dyoung /* Determine if the SFP+ PHY is dual speed or not. */
1464 1.1 dyoung hw->phy.multispeed_fiber = FALSE;
1465 1.1 dyoung if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
1466 1.1 dyoung (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
1467 1.1 dyoung ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
1468 1.1 dyoung (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
1469 1.1 dyoung hw->phy.multispeed_fiber = TRUE;
1470 1.1 dyoung
1471 1.1 dyoung /* Determine PHY vendor */
1472 1.1 dyoung if (hw->phy.type != ixgbe_phy_nl) {
1473 1.1 dyoung hw->phy.id = identifier;
1474 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1475 1.3 msaitoh IXGBE_SFF_VENDOR_OUI_BYTE0,
1476 1.3 msaitoh &oui_bytes[0]);
1477 1.1 dyoung
1478 1.5 msaitoh if (status != IXGBE_SUCCESS)
1479 1.1 dyoung goto err_read_i2c_eeprom;
1480 1.1 dyoung
1481 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1482 1.3 msaitoh IXGBE_SFF_VENDOR_OUI_BYTE1,
1483 1.3 msaitoh &oui_bytes[1]);
1484 1.1 dyoung
1485 1.5 msaitoh if (status != IXGBE_SUCCESS)
1486 1.1 dyoung goto err_read_i2c_eeprom;
1487 1.1 dyoung
1488 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw,
1489 1.3 msaitoh IXGBE_SFF_VENDOR_OUI_BYTE2,
1490 1.3 msaitoh &oui_bytes[2]);
1491 1.1 dyoung
1492 1.5 msaitoh if (status != IXGBE_SUCCESS)
1493 1.1 dyoung goto err_read_i2c_eeprom;
1494 1.1 dyoung
1495 1.1 dyoung vendor_oui =
1496 1.1 dyoung ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
1497 1.1 dyoung (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
1498 1.1 dyoung (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
1499 1.1 dyoung
1500 1.1 dyoung switch (vendor_oui) {
1501 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_TYCO:
1502 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1503 1.1 dyoung hw->phy.type =
1504 1.3 msaitoh ixgbe_phy_sfp_passive_tyco;
1505 1.1 dyoung break;
1506 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_FTL:
1507 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
1508 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_ftl_active;
1509 1.1 dyoung else
1510 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_ftl;
1511 1.1 dyoung break;
1512 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_AVAGO:
1513 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_avago;
1514 1.1 dyoung break;
1515 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_INTEL:
1516 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_intel;
1517 1.1 dyoung break;
1518 1.1 dyoung default:
1519 1.12 msaitoh if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1520 1.12 msaitoh hw->phy.type =
1521 1.12 msaitoh ixgbe_phy_sfp_passive_unknown;
1522 1.12 msaitoh else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
1523 1.12 msaitoh hw->phy.type =
1524 1.12 msaitoh ixgbe_phy_sfp_active_unknown;
1525 1.12 msaitoh else
1526 1.12 msaitoh hw->phy.type = ixgbe_phy_sfp_unknown;
1527 1.1 dyoung break;
1528 1.1 dyoung }
1529 1.1 dyoung }
1530 1.1 dyoung
1531 1.1 dyoung /* Allow any DA cable vendor */
1532 1.1 dyoung if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
1533 1.1 dyoung IXGBE_SFF_DA_ACTIVE_CABLE)) {
1534 1.1 dyoung status = IXGBE_SUCCESS;
1535 1.1 dyoung goto out;
1536 1.1 dyoung }
1537 1.1 dyoung
1538 1.1 dyoung /* Verify supported 1G SFP modules */
1539 1.1 dyoung if (comp_codes_10g == 0 &&
1540 1.1 dyoung !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
1541 1.4 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
1542 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1543 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
1544 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
1545 1.4 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
1546 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_unsupported;
1547 1.1 dyoung status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1548 1.1 dyoung goto out;
1549 1.1 dyoung }
1550 1.1 dyoung
1551 1.1 dyoung /* Anything else 82598-based is supported */
1552 1.1 dyoung if (hw->mac.type == ixgbe_mac_82598EB) {
1553 1.1 dyoung status = IXGBE_SUCCESS;
1554 1.1 dyoung goto out;
1555 1.1 dyoung }
1556 1.1 dyoung
1557 1.1 dyoung ixgbe_get_device_caps(hw, &enforce_sfp);
1558 1.1 dyoung if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
1559 1.6 msaitoh !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
1560 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
1561 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1562 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
1563 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
1564 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
1565 1.1 dyoung /* Make sure we're a supported PHY type */
1566 1.1 dyoung if (hw->phy.type == ixgbe_phy_sfp_intel) {
1567 1.1 dyoung status = IXGBE_SUCCESS;
1568 1.1 dyoung } else {
1569 1.4 msaitoh if (hw->allow_unsupported_sfp == TRUE) {
1570 1.12 msaitoh EWARN(hw, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n");
1571 1.4 msaitoh status = IXGBE_SUCCESS;
1572 1.4 msaitoh } else {
1573 1.4 msaitoh DEBUGOUT("SFP+ module not supported\n");
1574 1.4 msaitoh hw->phy.type =
1575 1.4 msaitoh ixgbe_phy_sfp_unsupported;
1576 1.4 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1577 1.4 msaitoh }
1578 1.1 dyoung }
1579 1.1 dyoung } else {
1580 1.1 dyoung status = IXGBE_SUCCESS;
1581 1.1 dyoung }
1582 1.1 dyoung }
1583 1.1 dyoung
1584 1.1 dyoung out:
1585 1.1 dyoung return status;
1586 1.1 dyoung
1587 1.1 dyoung err_read_i2c_eeprom:
1588 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1589 1.1 dyoung if (hw->phy.type != ixgbe_phy_nl) {
1590 1.1 dyoung hw->phy.id = 0;
1591 1.1 dyoung hw->phy.type = ixgbe_phy_unknown;
1592 1.1 dyoung }
1593 1.1 dyoung return IXGBE_ERR_SFP_NOT_PRESENT;
1594 1.1 dyoung }
1595 1.1 dyoung
1596 1.7 msaitoh /**
1597 1.7 msaitoh * ixgbe_get_supported_phy_sfp_layer_generic - Returns physical layer type
1598 1.7 msaitoh * @hw: pointer to hardware structure
1599 1.7 msaitoh *
1600 1.7 msaitoh * Determines physical layer capabilities of the current SFP.
1601 1.7 msaitoh */
1602 1.12 msaitoh u64 ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw)
1603 1.7 msaitoh {
1604 1.12 msaitoh u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
1605 1.7 msaitoh u8 comp_codes_10g = 0;
1606 1.7 msaitoh u8 comp_codes_1g = 0;
1607 1.7 msaitoh
1608 1.7 msaitoh DEBUGFUNC("ixgbe_get_supported_phy_sfp_layer_generic");
1609 1.7 msaitoh
1610 1.7 msaitoh hw->phy.ops.identify_sfp(hw);
1611 1.7 msaitoh if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
1612 1.7 msaitoh return physical_layer;
1613 1.7 msaitoh
1614 1.7 msaitoh switch (hw->phy.type) {
1615 1.7 msaitoh case ixgbe_phy_sfp_passive_tyco:
1616 1.7 msaitoh case ixgbe_phy_sfp_passive_unknown:
1617 1.7 msaitoh case ixgbe_phy_qsfp_passive_unknown:
1618 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU;
1619 1.7 msaitoh break;
1620 1.7 msaitoh case ixgbe_phy_sfp_ftl_active:
1621 1.7 msaitoh case ixgbe_phy_sfp_active_unknown:
1622 1.7 msaitoh case ixgbe_phy_qsfp_active_unknown:
1623 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA;
1624 1.7 msaitoh break;
1625 1.7 msaitoh case ixgbe_phy_sfp_avago:
1626 1.7 msaitoh case ixgbe_phy_sfp_ftl:
1627 1.7 msaitoh case ixgbe_phy_sfp_intel:
1628 1.7 msaitoh case ixgbe_phy_sfp_unknown:
1629 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw,
1630 1.7 msaitoh IXGBE_SFF_1GBE_COMP_CODES, &comp_codes_1g);
1631 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw,
1632 1.7 msaitoh IXGBE_SFF_10GBE_COMP_CODES, &comp_codes_10g);
1633 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
1634 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
1635 1.7 msaitoh else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
1636 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
1637 1.7 msaitoh else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE)
1638 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_T;
1639 1.7 msaitoh else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE)
1640 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_SX;
1641 1.7 msaitoh break;
1642 1.7 msaitoh case ixgbe_phy_qsfp_intel:
1643 1.7 msaitoh case ixgbe_phy_qsfp_unknown:
1644 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw,
1645 1.7 msaitoh IXGBE_SFF_QSFP_10GBE_COMP, &comp_codes_10g);
1646 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
1647 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
1648 1.7 msaitoh else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
1649 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
1650 1.7 msaitoh break;
1651 1.7 msaitoh default:
1652 1.7 msaitoh break;
1653 1.7 msaitoh }
1654 1.7 msaitoh
1655 1.7 msaitoh return physical_layer;
1656 1.7 msaitoh }
1657 1.7 msaitoh
1658 1.7 msaitoh /**
1659 1.7 msaitoh * ixgbe_identify_qsfp_module_generic - Identifies QSFP modules
1660 1.7 msaitoh * @hw: pointer to hardware structure
1661 1.7 msaitoh *
1662 1.7 msaitoh * Searches for and identifies the QSFP module and assigns appropriate PHY type
1663 1.7 msaitoh **/
1664 1.7 msaitoh s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
1665 1.7 msaitoh {
1666 1.7 msaitoh s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
1667 1.7 msaitoh u32 vendor_oui = 0;
1668 1.7 msaitoh enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
1669 1.7 msaitoh u8 identifier = 0;
1670 1.7 msaitoh u8 comp_codes_1g = 0;
1671 1.7 msaitoh u8 comp_codes_10g = 0;
1672 1.7 msaitoh u8 oui_bytes[3] = {0, 0, 0};
1673 1.7 msaitoh u16 enforce_sfp = 0;
1674 1.7 msaitoh u8 connector = 0;
1675 1.7 msaitoh u8 cable_length = 0;
1676 1.7 msaitoh u8 device_tech = 0;
1677 1.7 msaitoh bool active_cable = FALSE;
1678 1.7 msaitoh
1679 1.7 msaitoh DEBUGFUNC("ixgbe_identify_qsfp_module_generic");
1680 1.7 msaitoh
1681 1.7 msaitoh if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber_qsfp) {
1682 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1683 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_PRESENT;
1684 1.7 msaitoh goto out;
1685 1.7 msaitoh }
1686 1.7 msaitoh
1687 1.8 msaitoh /* LAN ID is needed for I2C access */
1688 1.8 msaitoh hw->mac.ops.set_lan_id(hw);
1689 1.8 msaitoh
1690 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
1691 1.7 msaitoh &identifier);
1692 1.7 msaitoh
1693 1.7 msaitoh if (status != IXGBE_SUCCESS)
1694 1.7 msaitoh goto err_read_i2c_eeprom;
1695 1.7 msaitoh
1696 1.7 msaitoh if (identifier != IXGBE_SFF_IDENTIFIER_QSFP_PLUS) {
1697 1.7 msaitoh hw->phy.type = ixgbe_phy_sfp_unsupported;
1698 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1699 1.7 msaitoh goto out;
1700 1.7 msaitoh }
1701 1.7 msaitoh
1702 1.7 msaitoh hw->phy.id = identifier;
1703 1.7 msaitoh
1704 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_10GBE_COMP,
1705 1.7 msaitoh &comp_codes_10g);
1706 1.7 msaitoh
1707 1.7 msaitoh if (status != IXGBE_SUCCESS)
1708 1.7 msaitoh goto err_read_i2c_eeprom;
1709 1.7 msaitoh
1710 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_1GBE_COMP,
1711 1.7 msaitoh &comp_codes_1g);
1712 1.7 msaitoh
1713 1.7 msaitoh if (status != IXGBE_SUCCESS)
1714 1.7 msaitoh goto err_read_i2c_eeprom;
1715 1.7 msaitoh
1716 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_QSFP_DA_PASSIVE_CABLE) {
1717 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_passive_unknown;
1718 1.7 msaitoh if (hw->bus.lan_id == 0)
1719 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core0;
1720 1.7 msaitoh else
1721 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core1;
1722 1.7 msaitoh } else if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE |
1723 1.7 msaitoh IXGBE_SFF_10GBASELR_CAPABLE)) {
1724 1.7 msaitoh if (hw->bus.lan_id == 0)
1725 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_srlr_core0;
1726 1.7 msaitoh else
1727 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_srlr_core1;
1728 1.7 msaitoh } else {
1729 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_QSFP_DA_ACTIVE_CABLE)
1730 1.7 msaitoh active_cable = TRUE;
1731 1.7 msaitoh
1732 1.7 msaitoh if (!active_cable) {
1733 1.7 msaitoh /* check for active DA cables that pre-date
1734 1.7 msaitoh * SFF-8436 v3.6 */
1735 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw,
1736 1.7 msaitoh IXGBE_SFF_QSFP_CONNECTOR,
1737 1.7 msaitoh &connector);
1738 1.7 msaitoh
1739 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw,
1740 1.7 msaitoh IXGBE_SFF_QSFP_CABLE_LENGTH,
1741 1.7 msaitoh &cable_length);
1742 1.7 msaitoh
1743 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw,
1744 1.7 msaitoh IXGBE_SFF_QSFP_DEVICE_TECH,
1745 1.7 msaitoh &device_tech);
1746 1.7 msaitoh
1747 1.7 msaitoh if ((connector ==
1748 1.7 msaitoh IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE) &&
1749 1.7 msaitoh (cable_length > 0) &&
1750 1.7 msaitoh ((device_tech >> 4) ==
1751 1.7 msaitoh IXGBE_SFF_QSFP_TRANSMITER_850NM_VCSEL))
1752 1.7 msaitoh active_cable = TRUE;
1753 1.7 msaitoh }
1754 1.7 msaitoh
1755 1.7 msaitoh if (active_cable) {
1756 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_active_unknown;
1757 1.7 msaitoh if (hw->bus.lan_id == 0)
1758 1.7 msaitoh hw->phy.sfp_type =
1759 1.7 msaitoh ixgbe_sfp_type_da_act_lmt_core0;
1760 1.7 msaitoh else
1761 1.7 msaitoh hw->phy.sfp_type =
1762 1.7 msaitoh ixgbe_sfp_type_da_act_lmt_core1;
1763 1.7 msaitoh } else {
1764 1.7 msaitoh /* unsupported module type */
1765 1.7 msaitoh hw->phy.type = ixgbe_phy_sfp_unsupported;
1766 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1767 1.7 msaitoh goto out;
1768 1.7 msaitoh }
1769 1.7 msaitoh }
1770 1.7 msaitoh
1771 1.7 msaitoh if (hw->phy.sfp_type != stored_sfp_type)
1772 1.7 msaitoh hw->phy.sfp_setup_needed = TRUE;
1773 1.7 msaitoh
1774 1.7 msaitoh /* Determine if the QSFP+ PHY is dual speed or not. */
1775 1.7 msaitoh hw->phy.multispeed_fiber = FALSE;
1776 1.7 msaitoh if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
1777 1.7 msaitoh (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
1778 1.7 msaitoh ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
1779 1.7 msaitoh (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
1780 1.7 msaitoh hw->phy.multispeed_fiber = TRUE;
1781 1.7 msaitoh
1782 1.7 msaitoh /* Determine PHY vendor for optical modules */
1783 1.7 msaitoh if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE |
1784 1.7 msaitoh IXGBE_SFF_10GBASELR_CAPABLE)) {
1785 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw,
1786 1.7 msaitoh IXGBE_SFF_QSFP_VENDOR_OUI_BYTE0,
1787 1.7 msaitoh &oui_bytes[0]);
1788 1.7 msaitoh
1789 1.7 msaitoh if (status != IXGBE_SUCCESS)
1790 1.7 msaitoh goto err_read_i2c_eeprom;
1791 1.7 msaitoh
1792 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw,
1793 1.7 msaitoh IXGBE_SFF_QSFP_VENDOR_OUI_BYTE1,
1794 1.7 msaitoh &oui_bytes[1]);
1795 1.7 msaitoh
1796 1.7 msaitoh if (status != IXGBE_SUCCESS)
1797 1.7 msaitoh goto err_read_i2c_eeprom;
1798 1.7 msaitoh
1799 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw,
1800 1.7 msaitoh IXGBE_SFF_QSFP_VENDOR_OUI_BYTE2,
1801 1.7 msaitoh &oui_bytes[2]);
1802 1.7 msaitoh
1803 1.7 msaitoh if (status != IXGBE_SUCCESS)
1804 1.7 msaitoh goto err_read_i2c_eeprom;
1805 1.7 msaitoh
1806 1.7 msaitoh vendor_oui =
1807 1.7 msaitoh ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
1808 1.7 msaitoh (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
1809 1.7 msaitoh (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
1810 1.7 msaitoh
1811 1.7 msaitoh if (vendor_oui == IXGBE_SFF_VENDOR_OUI_INTEL)
1812 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_intel;
1813 1.7 msaitoh else
1814 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_unknown;
1815 1.7 msaitoh
1816 1.7 msaitoh ixgbe_get_device_caps(hw, &enforce_sfp);
1817 1.7 msaitoh if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP)) {
1818 1.7 msaitoh /* Make sure we're a supported PHY type */
1819 1.7 msaitoh if (hw->phy.type == ixgbe_phy_qsfp_intel) {
1820 1.7 msaitoh status = IXGBE_SUCCESS;
1821 1.7 msaitoh } else {
1822 1.7 msaitoh if (hw->allow_unsupported_sfp == TRUE) {
1823 1.12 msaitoh EWARN(hw, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n");
1824 1.7 msaitoh status = IXGBE_SUCCESS;
1825 1.7 msaitoh } else {
1826 1.7 msaitoh DEBUGOUT("QSFP module not supported\n");
1827 1.7 msaitoh hw->phy.type =
1828 1.7 msaitoh ixgbe_phy_sfp_unsupported;
1829 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1830 1.7 msaitoh }
1831 1.7 msaitoh }
1832 1.7 msaitoh } else {
1833 1.7 msaitoh status = IXGBE_SUCCESS;
1834 1.7 msaitoh }
1835 1.7 msaitoh }
1836 1.7 msaitoh
1837 1.7 msaitoh out:
1838 1.7 msaitoh return status;
1839 1.7 msaitoh
1840 1.7 msaitoh err_read_i2c_eeprom:
1841 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1842 1.7 msaitoh hw->phy.id = 0;
1843 1.7 msaitoh hw->phy.type = ixgbe_phy_unknown;
1844 1.7 msaitoh
1845 1.7 msaitoh return IXGBE_ERR_SFP_NOT_PRESENT;
1846 1.7 msaitoh }
1847 1.3 msaitoh
1848 1.1 dyoung /**
1849 1.1 dyoung * ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
1850 1.1 dyoung * @hw: pointer to hardware structure
1851 1.1 dyoung * @list_offset: offset to the SFP ID list
1852 1.1 dyoung * @data_offset: offset to the SFP data block
1853 1.1 dyoung *
1854 1.1 dyoung * Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
1855 1.1 dyoung * so it returns the offsets to the phy init sequence block.
1856 1.1 dyoung **/
1857 1.1 dyoung s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
1858 1.3 msaitoh u16 *list_offset,
1859 1.3 msaitoh u16 *data_offset)
1860 1.1 dyoung {
1861 1.1 dyoung u16 sfp_id;
1862 1.1 dyoung u16 sfp_type = hw->phy.sfp_type;
1863 1.1 dyoung
1864 1.1 dyoung DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets");
1865 1.1 dyoung
1866 1.1 dyoung if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
1867 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1868 1.1 dyoung
1869 1.1 dyoung if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
1870 1.1 dyoung return IXGBE_ERR_SFP_NOT_PRESENT;
1871 1.1 dyoung
1872 1.1 dyoung if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
1873 1.1 dyoung (hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
1874 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1875 1.1 dyoung
1876 1.1 dyoung /*
1877 1.1 dyoung * Limiting active cables and 1G Phys must be initialized as
1878 1.1 dyoung * SR modules
1879 1.1 dyoung */
1880 1.1 dyoung if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
1881 1.8 msaitoh sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1882 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
1883 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_sx_core0)
1884 1.1 dyoung sfp_type = ixgbe_sfp_type_srlr_core0;
1885 1.1 dyoung else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
1886 1.8 msaitoh sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
1887 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
1888 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_sx_core1)
1889 1.1 dyoung sfp_type = ixgbe_sfp_type_srlr_core1;
1890 1.1 dyoung
1891 1.1 dyoung /* Read offset to PHY init contents */
1892 1.6 msaitoh if (hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset)) {
1893 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
1894 1.6 msaitoh "eeprom read at offset %d failed",
1895 1.6 msaitoh IXGBE_PHY_INIT_OFFSET_NL);
1896 1.6 msaitoh return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
1897 1.6 msaitoh }
1898 1.1 dyoung
1899 1.1 dyoung if ((!*list_offset) || (*list_offset == 0xFFFF))
1900 1.1 dyoung return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
1901 1.1 dyoung
1902 1.1 dyoung /* Shift offset to first ID word */
1903 1.1 dyoung (*list_offset)++;
1904 1.1 dyoung
1905 1.1 dyoung /*
1906 1.1 dyoung * Find the matching SFP ID in the EEPROM
1907 1.1 dyoung * and program the init sequence
1908 1.1 dyoung */
1909 1.6 msaitoh if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
1910 1.6 msaitoh goto err_phy;
1911 1.1 dyoung
1912 1.1 dyoung while (sfp_id != IXGBE_PHY_INIT_END_NL) {
1913 1.1 dyoung if (sfp_id == sfp_type) {
1914 1.1 dyoung (*list_offset)++;
1915 1.6 msaitoh if (hw->eeprom.ops.read(hw, *list_offset, data_offset))
1916 1.6 msaitoh goto err_phy;
1917 1.1 dyoung if ((!*data_offset) || (*data_offset == 0xFFFF)) {
1918 1.1 dyoung DEBUGOUT("SFP+ module not supported\n");
1919 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1920 1.1 dyoung } else {
1921 1.1 dyoung break;
1922 1.1 dyoung }
1923 1.1 dyoung } else {
1924 1.1 dyoung (*list_offset) += 2;
1925 1.1 dyoung if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
1926 1.6 msaitoh goto err_phy;
1927 1.1 dyoung }
1928 1.1 dyoung }
1929 1.1 dyoung
1930 1.1 dyoung if (sfp_id == IXGBE_PHY_INIT_END_NL) {
1931 1.1 dyoung DEBUGOUT("No matching SFP+ module found\n");
1932 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED;
1933 1.1 dyoung }
1934 1.1 dyoung
1935 1.1 dyoung return IXGBE_SUCCESS;
1936 1.6 msaitoh
1937 1.6 msaitoh err_phy:
1938 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
1939 1.6 msaitoh "eeprom read at offset %d failed", *list_offset);
1940 1.6 msaitoh return IXGBE_ERR_PHY;
1941 1.1 dyoung }
1942 1.1 dyoung
1943 1.1 dyoung /**
1944 1.1 dyoung * ixgbe_read_i2c_eeprom_generic - Reads 8 bit EEPROM word over I2C interface
1945 1.1 dyoung * @hw: pointer to hardware structure
1946 1.1 dyoung * @byte_offset: EEPROM byte offset to read
1947 1.1 dyoung * @eeprom_data: value read
1948 1.1 dyoung *
1949 1.1 dyoung * Performs byte read operation to SFP module's EEPROM over I2C interface.
1950 1.1 dyoung **/
1951 1.1 dyoung s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
1952 1.3 msaitoh u8 *eeprom_data)
1953 1.1 dyoung {
1954 1.1 dyoung DEBUGFUNC("ixgbe_read_i2c_eeprom_generic");
1955 1.1 dyoung
1956 1.1 dyoung return hw->phy.ops.read_i2c_byte(hw, byte_offset,
1957 1.3 msaitoh IXGBE_I2C_EEPROM_DEV_ADDR,
1958 1.3 msaitoh eeprom_data);
1959 1.1 dyoung }
1960 1.1 dyoung
1961 1.1 dyoung /**
1962 1.5 msaitoh * ixgbe_read_i2c_sff8472_generic - Reads 8 bit word over I2C interface
1963 1.5 msaitoh * @hw: pointer to hardware structure
1964 1.5 msaitoh * @byte_offset: byte offset at address 0xA2
1965 1.5 msaitoh * @eeprom_data: value read
1966 1.5 msaitoh *
1967 1.5 msaitoh * Performs byte read operation to SFP module's SFF-8472 data over I2C
1968 1.5 msaitoh **/
1969 1.5 msaitoh static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
1970 1.5 msaitoh u8 *sff8472_data)
1971 1.5 msaitoh {
1972 1.5 msaitoh return hw->phy.ops.read_i2c_byte(hw, byte_offset,
1973 1.5 msaitoh IXGBE_I2C_EEPROM_DEV_ADDR2,
1974 1.5 msaitoh sff8472_data);
1975 1.5 msaitoh }
1976 1.5 msaitoh
1977 1.5 msaitoh /**
1978 1.1 dyoung * ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface
1979 1.1 dyoung * @hw: pointer to hardware structure
1980 1.1 dyoung * @byte_offset: EEPROM byte offset to write
1981 1.1 dyoung * @eeprom_data: value to write
1982 1.1 dyoung *
1983 1.1 dyoung * Performs byte write operation to SFP module's EEPROM over I2C interface.
1984 1.1 dyoung **/
1985 1.1 dyoung s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
1986 1.3 msaitoh u8 eeprom_data)
1987 1.1 dyoung {
1988 1.1 dyoung DEBUGFUNC("ixgbe_write_i2c_eeprom_generic");
1989 1.1 dyoung
1990 1.1 dyoung return hw->phy.ops.write_i2c_byte(hw, byte_offset,
1991 1.3 msaitoh IXGBE_I2C_EEPROM_DEV_ADDR,
1992 1.3 msaitoh eeprom_data);
1993 1.1 dyoung }
1994 1.1 dyoung
1995 1.1 dyoung /**
1996 1.7 msaitoh * ixgbe_is_sfp_probe - Returns TRUE if SFP is being detected
1997 1.7 msaitoh * @hw: pointer to hardware structure
1998 1.7 msaitoh * @offset: eeprom offset to be read
1999 1.7 msaitoh * @addr: I2C address to be read
2000 1.7 msaitoh */
2001 1.7 msaitoh static bool ixgbe_is_sfp_probe(struct ixgbe_hw *hw, u8 offset, u8 addr)
2002 1.7 msaitoh {
2003 1.7 msaitoh if (addr == IXGBE_I2C_EEPROM_DEV_ADDR &&
2004 1.7 msaitoh offset == IXGBE_SFF_IDENTIFIER &&
2005 1.7 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_not_present)
2006 1.7 msaitoh return TRUE;
2007 1.7 msaitoh return FALSE;
2008 1.7 msaitoh }
2009 1.7 msaitoh
2010 1.7 msaitoh /**
2011 1.8 msaitoh * ixgbe_read_i2c_byte_generic_int - Reads 8 bit word over I2C
2012 1.1 dyoung * @hw: pointer to hardware structure
2013 1.1 dyoung * @byte_offset: byte offset to read
2014 1.1 dyoung * @data: value read
2015 1.8 msaitoh * @lock: TRUE if to take and release semaphore
2016 1.1 dyoung *
2017 1.1 dyoung * Performs byte read operation to SFP module's EEPROM over I2C interface at
2018 1.3 msaitoh * a specified device address.
2019 1.1 dyoung **/
2020 1.8 msaitoh static s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
2021 1.8 msaitoh u8 dev_addr, u8 *data, bool lock)
2022 1.1 dyoung {
2023 1.7 msaitoh s32 status;
2024 1.1 dyoung u32 max_retry = 10;
2025 1.1 dyoung u32 retry = 0;
2026 1.7 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask;
2027 1.1 dyoung bool nack = 1;
2028 1.3 msaitoh *data = 0;
2029 1.1 dyoung
2030 1.1 dyoung DEBUGFUNC("ixgbe_read_i2c_byte_generic");
2031 1.1 dyoung
2032 1.8 msaitoh if (hw->mac.type >= ixgbe_mac_X550)
2033 1.8 msaitoh max_retry = 3;
2034 1.7 msaitoh if (ixgbe_is_sfp_probe(hw, byte_offset, dev_addr))
2035 1.7 msaitoh max_retry = IXGBE_SFP_DETECT_RETRIES;
2036 1.1 dyoung
2037 1.1 dyoung do {
2038 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
2039 1.7 msaitoh return IXGBE_ERR_SWFW_SYNC;
2040 1.1 dyoung
2041 1.1 dyoung ixgbe_i2c_start(hw);
2042 1.1 dyoung
2043 1.1 dyoung /* Device Address and write indication */
2044 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
2045 1.1 dyoung if (status != IXGBE_SUCCESS)
2046 1.1 dyoung goto fail;
2047 1.1 dyoung
2048 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
2049 1.1 dyoung if (status != IXGBE_SUCCESS)
2050 1.1 dyoung goto fail;
2051 1.1 dyoung
2052 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
2053 1.1 dyoung if (status != IXGBE_SUCCESS)
2054 1.1 dyoung goto fail;
2055 1.1 dyoung
2056 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
2057 1.1 dyoung if (status != IXGBE_SUCCESS)
2058 1.1 dyoung goto fail;
2059 1.1 dyoung
2060 1.1 dyoung ixgbe_i2c_start(hw);
2061 1.1 dyoung
2062 1.1 dyoung /* Device Address and read indication */
2063 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, (dev_addr | 0x1));
2064 1.1 dyoung if (status != IXGBE_SUCCESS)
2065 1.1 dyoung goto fail;
2066 1.1 dyoung
2067 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
2068 1.1 dyoung if (status != IXGBE_SUCCESS)
2069 1.1 dyoung goto fail;
2070 1.1 dyoung
2071 1.1 dyoung status = ixgbe_clock_in_i2c_byte(hw, data);
2072 1.1 dyoung if (status != IXGBE_SUCCESS)
2073 1.1 dyoung goto fail;
2074 1.1 dyoung
2075 1.1 dyoung status = ixgbe_clock_out_i2c_bit(hw, nack);
2076 1.1 dyoung if (status != IXGBE_SUCCESS)
2077 1.1 dyoung goto fail;
2078 1.1 dyoung
2079 1.1 dyoung ixgbe_i2c_stop(hw);
2080 1.8 msaitoh if (lock)
2081 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2082 1.7 msaitoh return IXGBE_SUCCESS;
2083 1.1 dyoung
2084 1.1 dyoung fail:
2085 1.5 msaitoh ixgbe_i2c_bus_clear(hw);
2086 1.8 msaitoh if (lock) {
2087 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2088 1.8 msaitoh msec_delay(100);
2089 1.8 msaitoh }
2090 1.1 dyoung retry++;
2091 1.1 dyoung if (retry < max_retry)
2092 1.1 dyoung DEBUGOUT("I2C byte read error - Retrying.\n");
2093 1.1 dyoung else
2094 1.1 dyoung DEBUGOUT("I2C byte read error.\n");
2095 1.1 dyoung
2096 1.1 dyoung } while (retry < max_retry);
2097 1.1 dyoung
2098 1.1 dyoung return status;
2099 1.1 dyoung }
2100 1.1 dyoung
2101 1.1 dyoung /**
2102 1.8 msaitoh * ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
2103 1.8 msaitoh * @hw: pointer to hardware structure
2104 1.8 msaitoh * @byte_offset: byte offset to read
2105 1.8 msaitoh * @data: value read
2106 1.8 msaitoh *
2107 1.8 msaitoh * Performs byte read operation to SFP module's EEPROM over I2C interface at
2108 1.8 msaitoh * a specified device address.
2109 1.8 msaitoh **/
2110 1.8 msaitoh s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
2111 1.8 msaitoh u8 dev_addr, u8 *data)
2112 1.8 msaitoh {
2113 1.8 msaitoh return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2114 1.8 msaitoh data, TRUE);
2115 1.8 msaitoh }
2116 1.8 msaitoh
2117 1.8 msaitoh /**
2118 1.8 msaitoh * ixgbe_read_i2c_byte_generic_unlocked - Reads 8 bit word over I2C
2119 1.8 msaitoh * @hw: pointer to hardware structure
2120 1.8 msaitoh * @byte_offset: byte offset to read
2121 1.8 msaitoh * @data: value read
2122 1.8 msaitoh *
2123 1.8 msaitoh * Performs byte read operation to SFP module's EEPROM over I2C interface at
2124 1.8 msaitoh * a specified device address.
2125 1.8 msaitoh **/
2126 1.8 msaitoh s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
2127 1.8 msaitoh u8 dev_addr, u8 *data)
2128 1.8 msaitoh {
2129 1.8 msaitoh return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2130 1.8 msaitoh data, FALSE);
2131 1.8 msaitoh }
2132 1.8 msaitoh
2133 1.8 msaitoh /**
2134 1.8 msaitoh * ixgbe_write_i2c_byte_generic_int - Writes 8 bit word over I2C
2135 1.1 dyoung * @hw: pointer to hardware structure
2136 1.1 dyoung * @byte_offset: byte offset to write
2137 1.1 dyoung * @data: value to write
2138 1.8 msaitoh * @lock: TRUE if to take and release semaphore
2139 1.1 dyoung *
2140 1.1 dyoung * Performs byte write operation to SFP module's EEPROM over I2C interface at
2141 1.1 dyoung * a specified device address.
2142 1.1 dyoung **/
2143 1.8 msaitoh static s32 ixgbe_write_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
2144 1.8 msaitoh u8 dev_addr, u8 data, bool lock)
2145 1.1 dyoung {
2146 1.8 msaitoh s32 status;
2147 1.2 christos u32 max_retry = 2;
2148 1.1 dyoung u32 retry = 0;
2149 1.7 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask;
2150 1.1 dyoung
2151 1.1 dyoung DEBUGFUNC("ixgbe_write_i2c_byte_generic");
2152 1.1 dyoung
2153 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) !=
2154 1.8 msaitoh IXGBE_SUCCESS)
2155 1.8 msaitoh return IXGBE_ERR_SWFW_SYNC;
2156 1.1 dyoung
2157 1.1 dyoung do {
2158 1.1 dyoung ixgbe_i2c_start(hw);
2159 1.1 dyoung
2160 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
2161 1.1 dyoung if (status != IXGBE_SUCCESS)
2162 1.1 dyoung goto fail;
2163 1.1 dyoung
2164 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
2165 1.1 dyoung if (status != IXGBE_SUCCESS)
2166 1.1 dyoung goto fail;
2167 1.1 dyoung
2168 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
2169 1.1 dyoung if (status != IXGBE_SUCCESS)
2170 1.1 dyoung goto fail;
2171 1.1 dyoung
2172 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
2173 1.1 dyoung if (status != IXGBE_SUCCESS)
2174 1.1 dyoung goto fail;
2175 1.1 dyoung
2176 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, data);
2177 1.1 dyoung if (status != IXGBE_SUCCESS)
2178 1.1 dyoung goto fail;
2179 1.1 dyoung
2180 1.1 dyoung status = ixgbe_get_i2c_ack(hw);
2181 1.1 dyoung if (status != IXGBE_SUCCESS)
2182 1.1 dyoung goto fail;
2183 1.1 dyoung
2184 1.1 dyoung ixgbe_i2c_stop(hw);
2185 1.8 msaitoh if (lock)
2186 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2187 1.7 msaitoh return IXGBE_SUCCESS;
2188 1.1 dyoung
2189 1.1 dyoung fail:
2190 1.1 dyoung ixgbe_i2c_bus_clear(hw);
2191 1.1 dyoung retry++;
2192 1.1 dyoung if (retry < max_retry)
2193 1.1 dyoung DEBUGOUT("I2C byte write error - Retrying.\n");
2194 1.1 dyoung else
2195 1.1 dyoung DEBUGOUT("I2C byte write error.\n");
2196 1.1 dyoung } while (retry < max_retry);
2197 1.1 dyoung
2198 1.8 msaitoh if (lock)
2199 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2200 1.1 dyoung
2201 1.1 dyoung return status;
2202 1.1 dyoung }
2203 1.1 dyoung
2204 1.1 dyoung /**
2205 1.8 msaitoh * ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
2206 1.8 msaitoh * @hw: pointer to hardware structure
2207 1.8 msaitoh * @byte_offset: byte offset to write
2208 1.8 msaitoh * @data: value to write
2209 1.8 msaitoh *
2210 1.8 msaitoh * Performs byte write operation to SFP module's EEPROM over I2C interface at
2211 1.8 msaitoh * a specified device address.
2212 1.8 msaitoh **/
2213 1.8 msaitoh s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
2214 1.8 msaitoh u8 dev_addr, u8 data)
2215 1.8 msaitoh {
2216 1.8 msaitoh return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2217 1.8 msaitoh data, TRUE);
2218 1.8 msaitoh }
2219 1.8 msaitoh
2220 1.8 msaitoh /**
2221 1.8 msaitoh * ixgbe_write_i2c_byte_generic_unlocked - Writes 8 bit word over I2C
2222 1.8 msaitoh * @hw: pointer to hardware structure
2223 1.8 msaitoh * @byte_offset: byte offset to write
2224 1.8 msaitoh * @data: value to write
2225 1.8 msaitoh *
2226 1.8 msaitoh * Performs byte write operation to SFP module's EEPROM over I2C interface at
2227 1.8 msaitoh * a specified device address.
2228 1.8 msaitoh **/
2229 1.8 msaitoh s32 ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
2230 1.8 msaitoh u8 dev_addr, u8 data)
2231 1.8 msaitoh {
2232 1.8 msaitoh return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2233 1.8 msaitoh data, FALSE);
2234 1.8 msaitoh }
2235 1.8 msaitoh
2236 1.8 msaitoh /**
2237 1.1 dyoung * ixgbe_i2c_start - Sets I2C start condition
2238 1.1 dyoung * @hw: pointer to hardware structure
2239 1.1 dyoung *
2240 1.1 dyoung * Sets I2C start condition (High -> Low on SDA while SCL is High)
2241 1.7 msaitoh * Set bit-bang mode on X550 hardware.
2242 1.1 dyoung **/
2243 1.1 dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw)
2244 1.1 dyoung {
2245 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2246 1.1 dyoung
2247 1.1 dyoung DEBUGFUNC("ixgbe_i2c_start");
2248 1.1 dyoung
2249 1.7 msaitoh i2cctl |= IXGBE_I2C_BB_EN_BY_MAC(hw);
2250 1.7 msaitoh
2251 1.1 dyoung /* Start condition must begin with data and clock high */
2252 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1);
2253 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl);
2254 1.1 dyoung
2255 1.1 dyoung /* Setup time for start condition (4.7us) */
2256 1.1 dyoung usec_delay(IXGBE_I2C_T_SU_STA);
2257 1.1 dyoung
2258 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 0);
2259 1.1 dyoung
2260 1.1 dyoung /* Hold time for start condition (4us) */
2261 1.1 dyoung usec_delay(IXGBE_I2C_T_HD_STA);
2262 1.1 dyoung
2263 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
2264 1.1 dyoung
2265 1.1 dyoung /* Minimum low period of clock is 4.7 us */
2266 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
2267 1.1 dyoung
2268 1.1 dyoung }
2269 1.1 dyoung
2270 1.1 dyoung /**
2271 1.1 dyoung * ixgbe_i2c_stop - Sets I2C stop condition
2272 1.1 dyoung * @hw: pointer to hardware structure
2273 1.1 dyoung *
2274 1.1 dyoung * Sets I2C stop condition (Low -> High on SDA while SCL is High)
2275 1.7 msaitoh * Disables bit-bang mode and negates data output enable on X550
2276 1.7 msaitoh * hardware.
2277 1.1 dyoung **/
2278 1.1 dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw)
2279 1.1 dyoung {
2280 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2281 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2282 1.7 msaitoh u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
2283 1.7 msaitoh u32 bb_en_bit = IXGBE_I2C_BB_EN_BY_MAC(hw);
2284 1.1 dyoung
2285 1.1 dyoung DEBUGFUNC("ixgbe_i2c_stop");
2286 1.1 dyoung
2287 1.1 dyoung /* Stop condition must begin with data low and clock high */
2288 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 0);
2289 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl);
2290 1.1 dyoung
2291 1.1 dyoung /* Setup time for stop condition (4us) */
2292 1.1 dyoung usec_delay(IXGBE_I2C_T_SU_STO);
2293 1.1 dyoung
2294 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1);
2295 1.1 dyoung
2296 1.1 dyoung /* bus free time between stop and start (4.7us)*/
2297 1.1 dyoung usec_delay(IXGBE_I2C_T_BUF);
2298 1.7 msaitoh
2299 1.7 msaitoh if (bb_en_bit || data_oe_bit || clk_oe_bit) {
2300 1.7 msaitoh i2cctl &= ~bb_en_bit;
2301 1.7 msaitoh i2cctl |= data_oe_bit | clk_oe_bit;
2302 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2303 1.7 msaitoh IXGBE_WRITE_FLUSH(hw);
2304 1.7 msaitoh }
2305 1.1 dyoung }
2306 1.1 dyoung
2307 1.1 dyoung /**
2308 1.1 dyoung * ixgbe_clock_in_i2c_byte - Clocks in one byte via I2C
2309 1.1 dyoung * @hw: pointer to hardware structure
2310 1.1 dyoung * @data: data byte to clock in
2311 1.1 dyoung *
2312 1.1 dyoung * Clocks in one byte data via I2C data/clock
2313 1.1 dyoung **/
2314 1.1 dyoung static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data)
2315 1.1 dyoung {
2316 1.1 dyoung s32 i;
2317 1.1 dyoung bool bit = 0;
2318 1.1 dyoung
2319 1.1 dyoung DEBUGFUNC("ixgbe_clock_in_i2c_byte");
2320 1.1 dyoung
2321 1.7 msaitoh *data = 0;
2322 1.1 dyoung for (i = 7; i >= 0; i--) {
2323 1.3 msaitoh ixgbe_clock_in_i2c_bit(hw, &bit);
2324 1.1 dyoung *data |= bit << i;
2325 1.1 dyoung }
2326 1.1 dyoung
2327 1.3 msaitoh return IXGBE_SUCCESS;
2328 1.1 dyoung }
2329 1.1 dyoung
2330 1.1 dyoung /**
2331 1.1 dyoung * ixgbe_clock_out_i2c_byte - Clocks out one byte via I2C
2332 1.1 dyoung * @hw: pointer to hardware structure
2333 1.1 dyoung * @data: data byte clocked out
2334 1.1 dyoung *
2335 1.1 dyoung * Clocks out one byte data via I2C data/clock
2336 1.1 dyoung **/
2337 1.1 dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data)
2338 1.1 dyoung {
2339 1.1 dyoung s32 status = IXGBE_SUCCESS;
2340 1.1 dyoung s32 i;
2341 1.1 dyoung u32 i2cctl;
2342 1.7 msaitoh bool bit;
2343 1.1 dyoung
2344 1.1 dyoung DEBUGFUNC("ixgbe_clock_out_i2c_byte");
2345 1.1 dyoung
2346 1.1 dyoung for (i = 7; i >= 0; i--) {
2347 1.1 dyoung bit = (data >> i) & 0x1;
2348 1.1 dyoung status = ixgbe_clock_out_i2c_bit(hw, bit);
2349 1.1 dyoung
2350 1.1 dyoung if (status != IXGBE_SUCCESS)
2351 1.1 dyoung break;
2352 1.1 dyoung }
2353 1.1 dyoung
2354 1.1 dyoung /* Release SDA line (set high) */
2355 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2356 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2357 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2358 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2359 1.3 msaitoh IXGBE_WRITE_FLUSH(hw);
2360 1.1 dyoung
2361 1.1 dyoung return status;
2362 1.1 dyoung }
2363 1.1 dyoung
2364 1.1 dyoung /**
2365 1.1 dyoung * ixgbe_get_i2c_ack - Polls for I2C ACK
2366 1.1 dyoung * @hw: pointer to hardware structure
2367 1.1 dyoung *
2368 1.1 dyoung * Clocks in/out one bit via I2C data/clock
2369 1.1 dyoung **/
2370 1.1 dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
2371 1.1 dyoung {
2372 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2373 1.3 msaitoh s32 status = IXGBE_SUCCESS;
2374 1.1 dyoung u32 i = 0;
2375 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2376 1.1 dyoung u32 timeout = 10;
2377 1.1 dyoung bool ack = 1;
2378 1.1 dyoung
2379 1.1 dyoung DEBUGFUNC("ixgbe_get_i2c_ack");
2380 1.1 dyoung
2381 1.7 msaitoh if (data_oe_bit) {
2382 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2383 1.7 msaitoh i2cctl |= data_oe_bit;
2384 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2385 1.7 msaitoh IXGBE_WRITE_FLUSH(hw);
2386 1.7 msaitoh }
2387 1.3 msaitoh ixgbe_raise_i2c_clk(hw, &i2cctl);
2388 1.1 dyoung
2389 1.1 dyoung /* Minimum high period of clock is 4us */
2390 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
2391 1.1 dyoung
2392 1.1 dyoung /* Poll for ACK. Note that ACK in I2C spec is
2393 1.1 dyoung * transition from 1 to 0 */
2394 1.1 dyoung for (i = 0; i < timeout; i++) {
2395 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2396 1.7 msaitoh ack = ixgbe_get_i2c_data(hw, &i2cctl);
2397 1.1 dyoung
2398 1.1 dyoung usec_delay(1);
2399 1.7 msaitoh if (!ack)
2400 1.1 dyoung break;
2401 1.1 dyoung }
2402 1.1 dyoung
2403 1.7 msaitoh if (ack) {
2404 1.7 msaitoh DEBUGOUT("I2C ack was not received.\n");
2405 1.1 dyoung status = IXGBE_ERR_I2C;
2406 1.1 dyoung }
2407 1.1 dyoung
2408 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
2409 1.1 dyoung
2410 1.1 dyoung /* Minimum low period of clock is 4.7 us */
2411 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
2412 1.1 dyoung
2413 1.1 dyoung return status;
2414 1.1 dyoung }
2415 1.1 dyoung
2416 1.1 dyoung /**
2417 1.1 dyoung * ixgbe_clock_in_i2c_bit - Clocks in one bit via I2C data/clock
2418 1.1 dyoung * @hw: pointer to hardware structure
2419 1.1 dyoung * @data: read data value
2420 1.1 dyoung *
2421 1.1 dyoung * Clocks in one bit via I2C data/clock
2422 1.1 dyoung **/
2423 1.1 dyoung static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
2424 1.1 dyoung {
2425 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2426 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2427 1.1 dyoung
2428 1.1 dyoung DEBUGFUNC("ixgbe_clock_in_i2c_bit");
2429 1.1 dyoung
2430 1.7 msaitoh if (data_oe_bit) {
2431 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2432 1.7 msaitoh i2cctl |= data_oe_bit;
2433 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2434 1.7 msaitoh IXGBE_WRITE_FLUSH(hw);
2435 1.7 msaitoh }
2436 1.3 msaitoh ixgbe_raise_i2c_clk(hw, &i2cctl);
2437 1.1 dyoung
2438 1.1 dyoung /* Minimum high period of clock is 4us */
2439 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
2440 1.1 dyoung
2441 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2442 1.7 msaitoh *data = ixgbe_get_i2c_data(hw, &i2cctl);
2443 1.1 dyoung
2444 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
2445 1.1 dyoung
2446 1.1 dyoung /* Minimum low period of clock is 4.7 us */
2447 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
2448 1.1 dyoung
2449 1.3 msaitoh return IXGBE_SUCCESS;
2450 1.1 dyoung }
2451 1.1 dyoung
2452 1.1 dyoung /**
2453 1.1 dyoung * ixgbe_clock_out_i2c_bit - Clocks in/out one bit via I2C data/clock
2454 1.1 dyoung * @hw: pointer to hardware structure
2455 1.1 dyoung * @data: data value to write
2456 1.1 dyoung *
2457 1.1 dyoung * Clocks out one bit via I2C data/clock
2458 1.1 dyoung **/
2459 1.1 dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
2460 1.1 dyoung {
2461 1.1 dyoung s32 status;
2462 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2463 1.1 dyoung
2464 1.1 dyoung DEBUGFUNC("ixgbe_clock_out_i2c_bit");
2465 1.1 dyoung
2466 1.1 dyoung status = ixgbe_set_i2c_data(hw, &i2cctl, data);
2467 1.1 dyoung if (status == IXGBE_SUCCESS) {
2468 1.3 msaitoh ixgbe_raise_i2c_clk(hw, &i2cctl);
2469 1.1 dyoung
2470 1.1 dyoung /* Minimum high period of clock is 4us */
2471 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
2472 1.1 dyoung
2473 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
2474 1.1 dyoung
2475 1.1 dyoung /* Minimum low period of clock is 4.7 us.
2476 1.1 dyoung * This also takes care of the data hold time.
2477 1.1 dyoung */
2478 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
2479 1.1 dyoung } else {
2480 1.1 dyoung status = IXGBE_ERR_I2C;
2481 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
2482 1.6 msaitoh "I2C data was not set to %X\n", data);
2483 1.1 dyoung }
2484 1.1 dyoung
2485 1.1 dyoung return status;
2486 1.1 dyoung }
2487 1.7 msaitoh
2488 1.1 dyoung /**
2489 1.1 dyoung * ixgbe_raise_i2c_clk - Raises the I2C SCL clock
2490 1.1 dyoung * @hw: pointer to hardware structure
2491 1.1 dyoung * @i2cctl: Current value of I2CCTL register
2492 1.1 dyoung *
2493 1.1 dyoung * Raises the I2C clock line '0'->'1'
2494 1.7 msaitoh * Negates the I2C clock output enable on X550 hardware.
2495 1.1 dyoung **/
2496 1.3 msaitoh static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
2497 1.1 dyoung {
2498 1.7 msaitoh u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
2499 1.4 msaitoh u32 i = 0;
2500 1.4 msaitoh u32 timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT;
2501 1.4 msaitoh u32 i2cctl_r = 0;
2502 1.4 msaitoh
2503 1.1 dyoung DEBUGFUNC("ixgbe_raise_i2c_clk");
2504 1.1 dyoung
2505 1.7 msaitoh if (clk_oe_bit) {
2506 1.7 msaitoh *i2cctl |= clk_oe_bit;
2507 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2508 1.7 msaitoh }
2509 1.7 msaitoh
2510 1.4 msaitoh for (i = 0; i < timeout; i++) {
2511 1.7 msaitoh *i2cctl |= IXGBE_I2C_CLK_OUT_BY_MAC(hw);
2512 1.1 dyoung
2513 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2514 1.4 msaitoh IXGBE_WRITE_FLUSH(hw);
2515 1.4 msaitoh /* SCL rise time (1000ns) */
2516 1.4 msaitoh usec_delay(IXGBE_I2C_T_RISE);
2517 1.1 dyoung
2518 1.7 msaitoh i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2519 1.7 msaitoh if (i2cctl_r & IXGBE_I2C_CLK_IN_BY_MAC(hw))
2520 1.4 msaitoh break;
2521 1.4 msaitoh }
2522 1.1 dyoung }
2523 1.1 dyoung
2524 1.1 dyoung /**
2525 1.1 dyoung * ixgbe_lower_i2c_clk - Lowers the I2C SCL clock
2526 1.1 dyoung * @hw: pointer to hardware structure
2527 1.1 dyoung * @i2cctl: Current value of I2CCTL register
2528 1.1 dyoung *
2529 1.1 dyoung * Lowers the I2C clock line '1'->'0'
2530 1.7 msaitoh * Asserts the I2C clock output enable on X550 hardware.
2531 1.1 dyoung **/
2532 1.1 dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
2533 1.1 dyoung {
2534 1.1 dyoung DEBUGFUNC("ixgbe_lower_i2c_clk");
2535 1.1 dyoung
2536 1.7 msaitoh *i2cctl &= ~(IXGBE_I2C_CLK_OUT_BY_MAC(hw));
2537 1.7 msaitoh *i2cctl &= ~IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
2538 1.1 dyoung
2539 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2540 1.3 msaitoh IXGBE_WRITE_FLUSH(hw);
2541 1.1 dyoung
2542 1.1 dyoung /* SCL fall time (300ns) */
2543 1.1 dyoung usec_delay(IXGBE_I2C_T_FALL);
2544 1.1 dyoung }
2545 1.1 dyoung
2546 1.1 dyoung /**
2547 1.1 dyoung * ixgbe_set_i2c_data - Sets the I2C data bit
2548 1.1 dyoung * @hw: pointer to hardware structure
2549 1.1 dyoung * @i2cctl: Current value of I2CCTL register
2550 1.1 dyoung * @data: I2C data value (0 or 1) to set
2551 1.1 dyoung *
2552 1.1 dyoung * Sets the I2C data bit
2553 1.7 msaitoh * Asserts the I2C data output enable on X550 hardware.
2554 1.1 dyoung **/
2555 1.1 dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
2556 1.1 dyoung {
2557 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2558 1.1 dyoung s32 status = IXGBE_SUCCESS;
2559 1.1 dyoung
2560 1.1 dyoung DEBUGFUNC("ixgbe_set_i2c_data");
2561 1.1 dyoung
2562 1.1 dyoung if (data)
2563 1.7 msaitoh *i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2564 1.1 dyoung else
2565 1.7 msaitoh *i2cctl &= ~(IXGBE_I2C_DATA_OUT_BY_MAC(hw));
2566 1.7 msaitoh *i2cctl &= ~data_oe_bit;
2567 1.1 dyoung
2568 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2569 1.3 msaitoh IXGBE_WRITE_FLUSH(hw);
2570 1.1 dyoung
2571 1.1 dyoung /* Data rise/fall (1000ns/300ns) and set-up time (250ns) */
2572 1.1 dyoung usec_delay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA);
2573 1.1 dyoung
2574 1.7 msaitoh if (!data) /* Can't verify data in this case */
2575 1.7 msaitoh return IXGBE_SUCCESS;
2576 1.7 msaitoh if (data_oe_bit) {
2577 1.7 msaitoh *i2cctl |= data_oe_bit;
2578 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2579 1.7 msaitoh IXGBE_WRITE_FLUSH(hw);
2580 1.7 msaitoh }
2581 1.7 msaitoh
2582 1.1 dyoung /* Verify data was set correctly */
2583 1.7 msaitoh *i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2584 1.7 msaitoh if (data != ixgbe_get_i2c_data(hw, i2cctl)) {
2585 1.1 dyoung status = IXGBE_ERR_I2C;
2586 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
2587 1.6 msaitoh "Error - I2C data was not set to %X.\n",
2588 1.6 msaitoh data);
2589 1.1 dyoung }
2590 1.1 dyoung
2591 1.1 dyoung return status;
2592 1.1 dyoung }
2593 1.1 dyoung
2594 1.1 dyoung /**
2595 1.1 dyoung * ixgbe_get_i2c_data - Reads the I2C SDA data bit
2596 1.1 dyoung * @hw: pointer to hardware structure
2597 1.1 dyoung * @i2cctl: Current value of I2CCTL register
2598 1.1 dyoung *
2599 1.1 dyoung * Returns the I2C data bit value
2600 1.7 msaitoh * Negates the I2C data output enable on X550 hardware.
2601 1.1 dyoung **/
2602 1.7 msaitoh static bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl)
2603 1.1 dyoung {
2604 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2605 1.1 dyoung bool data;
2606 1.1 dyoung
2607 1.1 dyoung DEBUGFUNC("ixgbe_get_i2c_data");
2608 1.1 dyoung
2609 1.7 msaitoh if (data_oe_bit) {
2610 1.7 msaitoh *i2cctl |= data_oe_bit;
2611 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2612 1.7 msaitoh IXGBE_WRITE_FLUSH(hw);
2613 1.7 msaitoh usec_delay(IXGBE_I2C_T_FALL);
2614 1.7 msaitoh }
2615 1.7 msaitoh
2616 1.7 msaitoh if (*i2cctl & IXGBE_I2C_DATA_IN_BY_MAC(hw))
2617 1.1 dyoung data = 1;
2618 1.1 dyoung else
2619 1.1 dyoung data = 0;
2620 1.1 dyoung
2621 1.1 dyoung return data;
2622 1.1 dyoung }
2623 1.1 dyoung
2624 1.1 dyoung /**
2625 1.1 dyoung * ixgbe_i2c_bus_clear - Clears the I2C bus
2626 1.1 dyoung * @hw: pointer to hardware structure
2627 1.1 dyoung *
2628 1.1 dyoung * Clears the I2C bus by sending nine clock pulses.
2629 1.1 dyoung * Used when data line is stuck low.
2630 1.1 dyoung **/
2631 1.1 dyoung void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
2632 1.1 dyoung {
2633 1.7 msaitoh u32 i2cctl;
2634 1.1 dyoung u32 i;
2635 1.1 dyoung
2636 1.1 dyoung DEBUGFUNC("ixgbe_i2c_bus_clear");
2637 1.1 dyoung
2638 1.1 dyoung ixgbe_i2c_start(hw);
2639 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2640 1.1 dyoung
2641 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1);
2642 1.1 dyoung
2643 1.1 dyoung for (i = 0; i < 9; i++) {
2644 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl);
2645 1.1 dyoung
2646 1.1 dyoung /* Min high period of clock is 4us */
2647 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH);
2648 1.1 dyoung
2649 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl);
2650 1.1 dyoung
2651 1.1 dyoung /* Min low period of clock is 4.7us*/
2652 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW);
2653 1.1 dyoung }
2654 1.1 dyoung
2655 1.1 dyoung ixgbe_i2c_start(hw);
2656 1.1 dyoung
2657 1.1 dyoung /* Put the i2c bus back to default state */
2658 1.1 dyoung ixgbe_i2c_stop(hw);
2659 1.1 dyoung }
2660 1.1 dyoung
2661 1.1 dyoung /**
2662 1.4 msaitoh * ixgbe_tn_check_overtemp - Checks if an overtemp occurred.
2663 1.1 dyoung * @hw: pointer to hardware structure
2664 1.1 dyoung *
2665 1.1 dyoung * Checks if the LASI temp alarm status was triggered due to overtemp
2666 1.1 dyoung **/
2667 1.1 dyoung s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
2668 1.1 dyoung {
2669 1.1 dyoung s32 status = IXGBE_SUCCESS;
2670 1.1 dyoung u16 phy_data = 0;
2671 1.1 dyoung
2672 1.1 dyoung DEBUGFUNC("ixgbe_tn_check_overtemp");
2673 1.1 dyoung
2674 1.1 dyoung if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
2675 1.1 dyoung goto out;
2676 1.1 dyoung
2677 1.1 dyoung /* Check that the LASI temp alarm status was triggered */
2678 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
2679 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data);
2680 1.1 dyoung
2681 1.1 dyoung if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
2682 1.1 dyoung goto out;
2683 1.1 dyoung
2684 1.1 dyoung status = IXGBE_ERR_OVERTEMP;
2685 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_CAUTION, "Device over temperature");
2686 1.1 dyoung out:
2687 1.1 dyoung return status;
2688 1.1 dyoung }
2689 1.7 msaitoh
2690 1.7 msaitoh /**
2691 1.7 msaitoh * ixgbe_set_copper_phy_power - Control power for copper phy
2692 1.7 msaitoh * @hw: pointer to hardware structure
2693 1.7 msaitoh * @on: TRUE for on, FALSE for off
2694 1.7 msaitoh */
2695 1.7 msaitoh s32 ixgbe_set_copper_phy_power(struct ixgbe_hw *hw, bool on)
2696 1.7 msaitoh {
2697 1.7 msaitoh u32 status;
2698 1.7 msaitoh u16 reg;
2699 1.7 msaitoh
2700 1.10 msaitoh if (!on && ixgbe_mng_present(hw))
2701 1.10 msaitoh return 0;
2702 1.10 msaitoh
2703 1.7 msaitoh status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL,
2704 1.7 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2705 1.7 msaitoh ®);
2706 1.7 msaitoh if (status)
2707 1.7 msaitoh return status;
2708 1.7 msaitoh
2709 1.7 msaitoh if (on) {
2710 1.7 msaitoh reg &= ~IXGBE_MDIO_PHY_SET_LOW_POWER_MODE;
2711 1.7 msaitoh } else {
2712 1.7 msaitoh if (ixgbe_check_reset_blocked(hw))
2713 1.7 msaitoh return 0;
2714 1.7 msaitoh reg |= IXGBE_MDIO_PHY_SET_LOW_POWER_MODE;
2715 1.7 msaitoh }
2716 1.7 msaitoh
2717 1.7 msaitoh status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL,
2718 1.7 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2719 1.7 msaitoh reg);
2720 1.7 msaitoh return status;
2721 1.7 msaitoh }
2722