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