Deleted Added
full compact
1/******************************************************************************
2
3 Copyright (c) 2001-2008, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15
16 3. Neither the name of the Intel Corporation nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 181003 2008-07-30 18:15:18Z jfv $*/
33/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 185352 2008-11-26 23:41:18Z jfv $*/
34
35#include "ixgbe_api.h"
36#include "ixgbe_common.h"
37#include "ixgbe_phy.h"
38
39/**
40 * ixgbe_init_phy_ops_generic - Inits PHY function ptrs
41 * @hw: pointer to the hardware structure
42 *
43 * Initialize the function pointers.
44 **/
45s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
46{
47 struct ixgbe_phy_info *phy = &hw->phy;
48
49 /* PHY */
50 phy->ops.identify = &ixgbe_identify_phy_generic;
51 phy->ops.reset = &ixgbe_reset_phy_generic;
52 phy->ops.read_reg = &ixgbe_read_phy_reg_generic;
53 phy->ops.write_reg = &ixgbe_write_phy_reg_generic;
54 phy->ops.setup_link = &ixgbe_setup_phy_link_generic;
55 phy->ops.setup_link_speed = &ixgbe_setup_phy_link_speed_generic;
56 phy->ops.check_link = NULL;
57 phy->ops.get_firmware_version = NULL;
58 phy->ops.identify_sfp = &ixgbe_identify_sfp_module_generic;
59 phy->sfp_type = ixgbe_sfp_type_unknown;
60
61 return IXGBE_SUCCESS;
62}
63
64/**
65 * ixgbe_identify_phy_generic - Get physical layer module
66 * @hw: pointer to hardware structure
67 *
68 * Determines the physical layer module found on the current adapter.
69 **/
70s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
71{
72 s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
73 u32 phy_addr;
74
75 if (hw->phy.type == ixgbe_phy_unknown) {
76 for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
77 if (ixgbe_validate_phy_addr(hw, phy_addr)) {
78 hw->phy.addr = phy_addr;
79 ixgbe_get_phy_id(hw);
80 hw->phy.type =
81 ixgbe_get_phy_type_from_id(hw->phy.id);
82 status = IXGBE_SUCCESS;
83 break;
84 }
85 }
86 } else {
87 status = IXGBE_SUCCESS;
88 }
89
90 return status;
91}
92
93/**
94 * ixgbe_validate_phy_addr - Determines phy address is valid
95 * @hw: pointer to hardware structure
96 *
97 **/
98bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr)
99{
100 u16 phy_id = 0;
101 bool valid = FALSE;
102
103 hw->phy.addr = phy_addr;
104 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
105 IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id);
106
107 if (phy_id != 0xFFFF && phy_id != 0x0)
108 valid = TRUE;
109
110 return valid;
111}
112
113/**
114 * ixgbe_get_phy_id - Get the phy type
115 * @hw: pointer to hardware structure
116 *
117 **/
118s32 ixgbe_get_phy_id(struct ixgbe_hw *hw)
119{
120 u32 status;
121 u16 phy_id_high = 0;
122 u16 phy_id_low = 0;
123
124 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
125 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
126 &phy_id_high);
127
128 if (status == IXGBE_SUCCESS) {
129 hw->phy.id = (u32)(phy_id_high << 16);
130 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_LOW,
131 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
132 &phy_id_low);
133 hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK);
134 hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);
135 }
134
136 return status;
137}
138
139/**
140 * ixgbe_get_phy_type_from_id - Get the phy type
141 * @hw: pointer to hardware structure
142 *
143 **/
144enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
145{
146 enum ixgbe_phy_type phy_type;
147
148 switch (phy_id) {
149 case TN1010_PHY_ID:
150 phy_type = ixgbe_phy_tn;
151 break;
152 case QT2022_PHY_ID:
153 phy_type = ixgbe_phy_qt;
154 break;
155 case ATH_PHY_ID:
156 phy_type = ixgbe_phy_nl;
157 break;
158 default:
159 phy_type = ixgbe_phy_unknown;
160 break;
161 }
162
163 DEBUGOUT1("phy type found is %d\n", phy_type);
164 return phy_type;
165}
166
167/**
168 * ixgbe_reset_phy_generic - Performs a PHY reset
169 * @hw: pointer to hardware structure
170 **/
171s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
172{
173 /*
174 * Perform soft PHY reset to the PHY_XS.
175 * This will cause a soft reset to the PHY
176 */
177 return hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
178 IXGBE_MDIO_PHY_XS_DEV_TYPE,
179 IXGBE_MDIO_PHY_XS_RESET);
180}
181
182/**
183 * ixgbe_read_phy_reg_generic - Reads a value from a specified PHY register
184 * @hw: pointer to hardware structure
185 * @reg_addr: 32 bit address of PHY register to read
186 * @phy_data: Pointer to read data from PHY register
187 **/
188s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
189 u32 device_type, u16 *phy_data)
190{
191 u32 command;
192 u32 i;
193 u32 data;
194 s32 status = IXGBE_SUCCESS;
195 u16 gssr;
196
197 if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
198 gssr = IXGBE_GSSR_PHY1_SM;
199 else
200 gssr = IXGBE_GSSR_PHY0_SM;
201
202 if (ixgbe_acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS)
203 status = IXGBE_ERR_SWFW_SYNC;
204
205 if (status == IXGBE_SUCCESS) {
206 /* Setup and write the address cycle command */
207 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
208 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
209 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
210 (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
211
212 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
213
214 /*
215 * Check every 10 usec to see if the address cycle completed.
216 * The MDI Command bit will clear when the operation is
217 * complete
218 */
219 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
220 usec_delay(10);
221
222 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
223
220 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0) {
224 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
225 break;
222 }
226 }
227
228 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
229 DEBUGOUT("PHY address command did not complete.\n");
230 status = IXGBE_ERR_PHY;
231 }
232
233 if (status == IXGBE_SUCCESS) {
234 /*
235 * Address cycle complete, setup and write the read
236 * command
237 */
238 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
239 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
240 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
241 (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND));
242
243 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
244
245 /*
246 * Check every 10 usec to see if the address cycle
247 * completed. The MDI Command bit will clear when the
248 * operation is complete
249 */
250 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
251 usec_delay(10);
252
253 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
254
255 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
256 break;
257 }
258
259 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
260 DEBUGOUT("PHY read command didn't complete\n");
261 status = IXGBE_ERR_PHY;
262 } else {
263 /*
264 * Read operation is complete. Get the data
265 * from MSRWD
266 */
267 data = IXGBE_READ_REG(hw, IXGBE_MSRWD);
268 data >>= IXGBE_MSRWD_READ_DATA_SHIFT;
269 *phy_data = (u16)(data);
270 }
271 }
272
273 ixgbe_release_swfw_sync(hw, gssr);
274 }
275
276 return status;
277}
278
279/**
280 * ixgbe_write_phy_reg_generic - Writes a value to specified PHY register
281 * @hw: pointer to hardware structure
282 * @reg_addr: 32 bit PHY register to write
283 * @device_type: 5 bit device type
284 * @phy_data: Data to write to the PHY register
285 **/
286s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
287 u32 device_type, u16 phy_data)
288{
289 u32 command;
290 u32 i;
291 s32 status = IXGBE_SUCCESS;
292 u16 gssr;
293
294 if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
295 gssr = IXGBE_GSSR_PHY1_SM;
296 else
297 gssr = IXGBE_GSSR_PHY0_SM;
298
299 if (ixgbe_acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS)
300 status = IXGBE_ERR_SWFW_SYNC;
301
302 if (status == IXGBE_SUCCESS) {
303 /* Put the data in the MDI single read and write data register*/
304 IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);
305
306 /* Setup and write the address cycle command */
307 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
308 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
309 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
310 (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
311
312 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
313
314 /*
315 * Check every 10 usec to see if the address cycle completed.
316 * The MDI Command bit will clear when the operation is
317 * complete
318 */
319 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
320 usec_delay(10);
321
322 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
323
324 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
325 break;
326 }
327
328 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
329 DEBUGOUT("PHY address cmd didn't complete\n");
330 status = IXGBE_ERR_PHY;
331 }
332
333 if (status == IXGBE_SUCCESS) {
334 /*
335 * Address cycle complete, setup and write the write
336 * command
337 */
338 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
339 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
340 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
341 (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND));
342
343 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
344
345 /*
346 * Check every 10 usec to see if the address cycle
347 * completed. The MDI Command bit will clear when the
348 * operation is complete
349 */
350 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
351 usec_delay(10);
352
353 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
354
355 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
356 break;
357 }
358
359 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
360 DEBUGOUT("PHY address cmd didn't complete\n");
361 status = IXGBE_ERR_PHY;
362 }
363 }
364
365 ixgbe_release_swfw_sync(hw, gssr);
366 }
367
368 return status;
369}
370
371/**
372 * ixgbe_setup_phy_link_generic - Set and restart autoneg
373 * @hw: pointer to hardware structure
374 *
375 * Restart autonegotiation and PHY and waits for completion.
376 **/
377s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
378{
379 s32 status = IXGBE_NOT_IMPLEMENTED;
380 u32 time_out;
381 u32 max_time_out = 10;
382 u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
383
384 /*
385 * Set advertisement settings in PHY based on autoneg_advertised
386 * settings. If autoneg_advertised = 0, then advertise default values
387 * tnx devices cannot be "forced" to a autoneg 10G and fail. But can
388 * for a 1G.
389 */
390 hw->phy.ops.read_reg(hw, IXGBE_MII_SPEED_SELECTION_REG,
391 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
392
393 if (hw->phy.autoneg_advertised == IXGBE_LINK_SPEED_1GB_FULL)
394 autoneg_reg &= 0xEFFF; /* 0 in bit 12 is 1G operation */
395 else
396 autoneg_reg |= 0x1000; /* 1 in bit 12 is 10G/1G operation */
397
398 hw->phy.ops.write_reg(hw, IXGBE_MII_SPEED_SELECTION_REG,
399 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
400
401 /* Restart PHY autonegotiation and wait for completion */
402 hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
403 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
404
405 autoneg_reg |= IXGBE_MII_RESTART;
406
407 hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
408 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
409
410 /* Wait for autonegotiation to finish */
411 for (time_out = 0; time_out < max_time_out; time_out++) {
412 usec_delay(10);
413 /* Restart PHY autonegotiation and wait for completion */
414 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
415 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
416 &autoneg_reg);
417
418 autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE;
419 if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) {
420 status = IXGBE_SUCCESS;
421 break;
422 }
423 }
424
425 if (time_out == max_time_out)
426 status = IXGBE_ERR_LINK_SETUP;
427
428 return status;
429}
430
431/**
432 * ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
433 * @hw: pointer to hardware structure
434 * @speed: new link speed
435 * @autoneg: TRUE if autonegotiation enabled
436 **/
437s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
438 ixgbe_link_speed speed,
439 bool autoneg,
440 bool autoneg_wait_to_complete)
441{
442 UNREFERENCED_PARAMETER(autoneg);
443 UNREFERENCED_PARAMETER(autoneg_wait_to_complete);
444
445 /*
446 * Clear autoneg_advertised and set new values based on input link
447 * speed.
448 */
449 hw->phy.autoneg_advertised = 0;
450
448 if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
451 if (speed & IXGBE_LINK_SPEED_10GB_FULL)
452 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
450 }
451 if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
453
454 if (speed & IXGBE_LINK_SPEED_1GB_FULL)
455 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
453 }
456
457 /* Setup link based on the new speed settings */
458 hw->phy.ops.setup_link(hw);
459
460 return IXGBE_SUCCESS;
461}
462
463/**
464 * ixgbe_check_phy_link_tnx - Determine link and speed status
465 * @hw: pointer to hardware structure
466 *
467 * Reads the VS1 register to determine if link is up and the current speed for
468 * the PHY.
469 **/
470s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
471 bool *link_up)
472{
473 s32 status = IXGBE_SUCCESS;
474 u32 time_out;
475 u32 max_time_out = 10;
476 u16 phy_link = 0;
477 u16 phy_speed = 0;
478 u16 phy_data = 0;
479
480 /* Initialize speed and link to default case */
481 *link_up = FALSE;
482 *speed = IXGBE_LINK_SPEED_10GB_FULL;
483
484 /*
485 * Check current speed and link status of the PHY register.
486 * This is a vendor specific register and may have to
487 * be changed for other copper PHYs.
488 */
489 for (time_out = 0; time_out < max_time_out; time_out++) {
490 usec_delay(10);
491 status = hw->phy.ops.read_reg(hw,
492 IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,
493 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
494 &phy_data);
495 phy_link = phy_data &
496 IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;
497 phy_speed = phy_data &
498 IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;
499 if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {
500 *link_up = TRUE;
501 if (phy_speed ==
502 IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)
503 *speed = IXGBE_LINK_SPEED_1GB_FULL;
504 break;
505 }
506 }
507
508 return status;
509}
510
511/**
512 * ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
513 * @hw: pointer to hardware structure
514 * @firmware_version: pointer to the PHY Firmware Version
515 **/
516s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
517 u16 *firmware_version)
518{
519 s32 status = IXGBE_SUCCESS;
520
521 status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
522 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
523 firmware_version);
524
525 return status;
526}
527
528/**
529 * ixgbe_reset_phy_nl - Performs a PHY reset
530 * @hw: pointer to hardware structure
531 **/
532s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
533{
534 u16 phy_offset, control, eword, edata, block_crc;
535 bool end_data = FALSE;
536 u16 list_offset, data_offset;
537 u16 phy_data = 0;
538 s32 ret_val = IXGBE_SUCCESS;
539 u32 i;
540
541 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
542 IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
543
544 /* reset the PHY and poll for completion */
545 hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
546 IXGBE_MDIO_PHY_XS_DEV_TYPE,
547 (phy_data | IXGBE_MDIO_PHY_XS_RESET));
548
549 for (i = 0; i < 100; i++) {
550 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
551 IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
552 if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0)
553 break;
554 msec_delay(10);
555 }
556
557 if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) {
558 DEBUGOUT("PHY reset did not complete.\n");
559 ret_val = IXGBE_ERR_PHY;
560 goto out;
561 }
562
563 /* Get init offsets */
564 ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
565 &data_offset);
566 if (ret_val != IXGBE_SUCCESS)
567 goto out;
568
569 ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc);
570 data_offset++;
571 while (!end_data) {
572 /*
573 * Read control word from PHY init contents offset
574 */
575 ret_val = hw->eeprom.ops.read(hw, data_offset, &eword);
576 control = (eword & IXGBE_CONTROL_MASK_NL) >>
577 IXGBE_CONTROL_SHIFT_NL;
578 edata = eword & IXGBE_DATA_MASK_NL;
579 switch (control) {
580 case IXGBE_DELAY_NL:
581 data_offset++;
582 DEBUGOUT1("DELAY: %d MS\n", edata);
583 msec_delay(edata);
584 break;
585 case IXGBE_DATA_NL:
586 DEBUGOUT("DATA: \n");
587 data_offset++;
588 hw->eeprom.ops.read(hw, data_offset++,
589 &phy_offset);
590 for (i = 0; i < edata; i++) {
591 hw->eeprom.ops.read(hw, data_offset, &eword);
592 hw->phy.ops.write_reg(hw, phy_offset,
593 IXGBE_TWINAX_DEV, eword);
594 DEBUGOUT2("Wrote %4.4x to %4.4x\n", eword,
595 phy_offset);
596 data_offset++;
597 phy_offset++;
598 }
599 break;
600 case IXGBE_CONTROL_NL:
601 data_offset++;
602 DEBUGOUT("CONTROL: \n");
603 if (edata == IXGBE_CONTROL_EOL_NL) {
604 DEBUGOUT("EOL\n");
605 end_data = TRUE;
606 } else if (edata == IXGBE_CONTROL_SOL_NL) {
607 DEBUGOUT("SOL\n");
608 } else {
609 DEBUGOUT("Bad control value\n");
610 ret_val = IXGBE_ERR_PHY;
611 goto out;
612 }
613 break;
614 default:
615 DEBUGOUT("Bad control type\n");
616 ret_val = IXGBE_ERR_PHY;
617 goto out;
618 }
619 }
620
621out:
622 return ret_val;
623}
624
625/**
626 * ixgbe_identify_sfp_module_generic - Identifies SFP modules
627 * @hw: pointer to hardware structure
628 *
629 * Searches for and identifies the SFP module and assigns appropriate PHY type.
630 **/
631s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
632{
633 s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
634 u32 vendor_oui = 0;
635 u8 identifier = 0;
636 u8 comp_codes_1g = 0;
637 u8 comp_codes_10g = 0;
638 u8 oui_bytes[4] = {0, 0, 0, 0};
639 u8 transmission_media = 0;
640
641 status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
642 &identifier);
643
644 if (status == IXGBE_ERR_SFP_NOT_PRESENT) {
645 hw->phy.sfp_type = ixgbe_sfp_type_not_present;
646 goto out;
647 }
648
649 if (identifier == IXGBE_SFF_IDENTIFIER_SFP) {
650 hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_1GBE_COMP_CODES,
651 &comp_codes_1g);
652 hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_10GBE_COMP_CODES,
653 &comp_codes_10g);
654 hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_TRANSMISSION_MEDIA,
655 &transmission_media);
656
657 /* ID Module
658 * =========
659 * 0 SFP_DA_CU
660 * 1 SFP_SR
661 * 2 SFP_LR
662 */
663 if (transmission_media & IXGBE_SFF_TWIN_AX_CAPABLE)
664 hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
665 else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
666 hw->phy.sfp_type = ixgbe_sfp_type_sr;
667 else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
668 hw->phy.sfp_type = ixgbe_sfp_type_lr;
669 else
670 hw->phy.sfp_type = ixgbe_sfp_type_unknown;
671
672 /* Determine if the SFP+ PHY is dual speed or not. */
673 if ((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
674 (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE))
675 hw->phy.multispeed_fiber = TRUE;
676 /* Determine PHY vendor */
677 if (hw->phy.type == ixgbe_phy_unknown) {
678 hw->phy.id = identifier;
679 hw->phy.ops.read_i2c_eeprom(hw,
680 IXGBE_SFF_VENDOR_OUI_BYTE0,
681 &oui_bytes[0]);
682 hw->phy.ops.read_i2c_eeprom(hw,
683 IXGBE_SFF_VENDOR_OUI_BYTE1,
684 &oui_bytes[1]);
685 hw->phy.ops.read_i2c_eeprom(hw,
686 IXGBE_SFF_VENDOR_OUI_BYTE2,
687 &oui_bytes[2]);
688
689 vendor_oui =
690 ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
691 (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
692 (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
693
694 switch (vendor_oui) {
695 case IXGBE_SFF_VENDOR_OUI_TYCO:
696 if (transmission_media &
697 IXGBE_SFF_TWIN_AX_CAPABLE)
698 hw->phy.type = ixgbe_phy_tw_tyco;
699 break;
700 case IXGBE_SFF_VENDOR_OUI_FTL:
701 hw->phy.type = ixgbe_phy_sfp_ftl;
702 break;
703 case IXGBE_SFF_VENDOR_OUI_AVAGO:
704 hw->phy.type = ixgbe_phy_sfp_avago;
705 break;
706 default:
707 if (transmission_media &
708 IXGBE_SFF_TWIN_AX_CAPABLE)
709 hw->phy.type = ixgbe_phy_tw_unknown;
710 else
711 hw->phy.type = ixgbe_phy_sfp_unknown;
712 break;
713 }
714 }
715 status = IXGBE_SUCCESS;
716 }
717
718out:
719 return status;
720}
721
722/**
723 * ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
724 * @hw: pointer to hardware structure
725 * @list_offset: offset to the SFP ID list
726 * @data_offset: offset to the SFP data block
727 *
728 * Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
729 * so it returns the offsets to the phy init sequence block.
730 **/
731s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
732 u16 *list_offset,
733 u16 *data_offset)
734{
735 u16 sfp_id;
736
737 if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
738 return IXGBE_ERR_SFP_NOT_SUPPORTED;
739
740 if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
741 return IXGBE_ERR_SFP_NOT_PRESENT;
742
743 if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
744 (hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
745 return IXGBE_ERR_SFP_NOT_SUPPORTED;
746
747 /* Read offset to PHY init contents */
748 hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset);
749
750 if ((!*list_offset) || (*list_offset == 0xFFFF))
751 return IXGBE_ERR_PHY;
752
753 /* Shift offset to first ID word */
754 (*list_offset)++;
755
756 /*
757 * Find the matching SFP ID in the EEPROM
758 * and program the init sequence
759 */
760 hw->eeprom.ops.read(hw, *list_offset, &sfp_id);
761
762 while (sfp_id != IXGBE_PHY_INIT_END_NL) {
763 if (sfp_id == hw->phy.sfp_type) {
764 (*list_offset)++;
765 hw->eeprom.ops.read(hw, *list_offset, data_offset);
766 if ((!*data_offset) || (*data_offset == 0xFFFF)) {
767 DEBUGOUT("SFP+ module not supported\n");
768 return IXGBE_ERR_SFP_NOT_SUPPORTED;
769 } else {
770 break;
771 }
772 } else {
773 (*list_offset) += 2;
774 if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
775 return IXGBE_ERR_PHY;
776 }
777 }
778
779 if (sfp_id == IXGBE_PHY_INIT_END_NL) {
780 DEBUGOUT("No matching SFP+ module found\n");
781 return IXGBE_ERR_SFP_NOT_SUPPORTED;
782 }
783
784 return IXGBE_SUCCESS;
785}
786