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