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