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