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