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