1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015-2020
6 #include "txgbe_eeprom.h"
10 static void txgbe_i2c_start(struct txgbe_hw *hw);
11 static void txgbe_i2c_stop(struct txgbe_hw *hw);
14 * txgbe_identify_extphy - Identify a single address for a PHY
15 * @hw: pointer to hardware structure
16 * @phy_addr: PHY address to probe
18 * Returns true if PHY found
20 static bool txgbe_identify_extphy(struct txgbe_hw *hw)
24 if (!txgbe_validate_phy_addr(hw, phy_addr)) {
25 DEBUGOUT("Unable to validate PHY address 0x%04X\n",
30 if (txgbe_get_phy_id(hw))
33 hw->phy.type = txgbe_get_phy_type_from_id(hw->phy.id);
34 if (hw->phy.type == txgbe_phy_unknown) {
36 hw->phy.read_reg(hw, TXGBE_MD_PHY_EXT_ABILITY,
40 if (ext_ability & (TXGBE_MD_PHY_10GBASET_ABILITY |
41 TXGBE_MD_PHY_1000BASET_ABILITY))
42 hw->phy.type = txgbe_phy_cu_unknown;
44 hw->phy.type = txgbe_phy_generic;
51 * txgbe_read_phy_if - Read TXGBE_ETHPHYIF register
52 * @hw: pointer to hardware structure
54 * Read TXGBE_ETHPHYIF register and save field values,
55 * and check for valid field values.
57 static s32 txgbe_read_phy_if(struct txgbe_hw *hw)
59 hw->phy.media_type = hw->phy.get_media_type(hw);
61 /* Save NW management interface connected on board. This is used
62 * to determine internal PHY mode.
64 hw->phy.nw_mng_if_sel = rd32(hw, TXGBE_ETHPHYIF);
66 /* If MDIO is connected to external PHY, then set PHY address. */
67 if (hw->phy.nw_mng_if_sel & TXGBE_ETHPHYIF_MDIO_ACT)
68 hw->phy.addr = TXGBE_ETHPHYIF_MDIO_BASE(hw->phy.nw_mng_if_sel);
70 if (!hw->phy.phy_semaphore_mask) {
72 hw->phy.phy_semaphore_mask = TXGBE_MNGSEM_SWPHY;
74 hw->phy.phy_semaphore_mask = TXGBE_MNGSEM_SWPHY;
81 * txgbe_identify_phy - Get physical layer module
82 * @hw: pointer to hardware structure
84 * Determines the physical layer module found on the current adapter.
86 s32 txgbe_identify_phy(struct txgbe_hw *hw)
88 s32 err = TXGBE_ERR_PHY_ADDR_INVALID;
90 DEBUGFUNC("txgbe_identify_phy");
92 txgbe_read_phy_if(hw);
94 if (hw->phy.type != txgbe_phy_unknown)
97 /* Raptor 10GBASE-T requires an external PHY */
98 if (hw->phy.media_type == txgbe_media_type_copper) {
99 err = txgbe_identify_extphy(hw);
100 } else if (hw->phy.media_type == txgbe_media_type_fiber) {
101 err = txgbe_identify_module(hw);
103 hw->phy.type = txgbe_phy_none;
107 /* Return error if SFP module has been detected but is not supported */
108 if (hw->phy.type == txgbe_phy_sfp_unsupported)
109 return TXGBE_ERR_SFP_NOT_SUPPORTED;
115 * txgbe_check_reset_blocked - check status of MNG FW veto bit
116 * @hw: pointer to the hardware structure
118 * This function checks the STAT.MNGVETO bit to see if there are
119 * any constraints on link from manageability. For MAC's that don't
120 * have this bit just return faluse since the link can not be blocked
123 s32 txgbe_check_reset_blocked(struct txgbe_hw *hw)
127 DEBUGFUNC("txgbe_check_reset_blocked");
129 mmngc = rd32(hw, TXGBE_STAT);
130 if (mmngc & TXGBE_STAT_MNGVETO) {
131 DEBUGOUT("MNG_VETO bit detected.\n");
139 * txgbe_validate_phy_addr - Determines phy address is valid
140 * @hw: pointer to hardware structure
141 * @phy_addr: PHY address
144 bool txgbe_validate_phy_addr(struct txgbe_hw *hw, u32 phy_addr)
149 DEBUGFUNC("txgbe_validate_phy_addr");
151 hw->phy.addr = phy_addr;
152 hw->phy.read_reg(hw, TXGBE_MD_PHY_ID_HIGH,
153 TXGBE_MD_DEV_PMA_PMD, &phy_id);
155 if (phy_id != 0xFFFF && phy_id != 0x0)
158 DEBUGOUT("PHY ID HIGH is 0x%04X\n", phy_id);
164 * txgbe_get_phy_id - Get the phy type
165 * @hw: pointer to hardware structure
168 s32 txgbe_get_phy_id(struct txgbe_hw *hw)
174 DEBUGFUNC("txgbe_get_phy_id");
176 err = hw->phy.read_reg(hw, TXGBE_MD_PHY_ID_HIGH,
177 TXGBE_MD_DEV_PMA_PMD,
181 hw->phy.id = (u32)(phy_id_high << 16);
182 err = hw->phy.read_reg(hw, TXGBE_MD_PHY_ID_LOW,
183 TXGBE_MD_DEV_PMA_PMD,
185 hw->phy.id |= (u32)(phy_id_low & TXGBE_PHY_REVISION_MASK);
186 hw->phy.revision = (u32)(phy_id_low & ~TXGBE_PHY_REVISION_MASK);
188 DEBUGOUT("PHY_ID_HIGH 0x%04X, PHY_ID_LOW 0x%04X\n",
189 phy_id_high, phy_id_low);
195 * txgbe_get_phy_type_from_id - Get the phy type
196 * @phy_id: PHY ID information
199 enum txgbe_phy_type txgbe_get_phy_type_from_id(u32 phy_id)
201 enum txgbe_phy_type phy_type;
203 DEBUGFUNC("txgbe_get_phy_type_from_id");
206 case TXGBE_PHYID_TN1010:
207 phy_type = txgbe_phy_tn;
209 case TXGBE_PHYID_QT2022:
210 phy_type = txgbe_phy_qt;
212 case TXGBE_PHYID_ATH:
213 phy_type = txgbe_phy_nl;
215 case TXGBE_PHYID_MTD3310:
216 phy_type = txgbe_phy_cu_mtd;
219 phy_type = txgbe_phy_unknown;
227 txgbe_reset_extphy(struct txgbe_hw *hw)
232 err = hw->phy.read_reg(hw, TXGBE_MD_PORT_CTRL,
233 TXGBE_MD_DEV_GENERAL, &ctrl);
236 ctrl |= TXGBE_MD_PORT_CTRL_RESET;
237 err = hw->phy.write_reg(hw, TXGBE_MD_PORT_CTRL,
238 TXGBE_MD_DEV_GENERAL, ctrl);
243 * Poll for reset bit to self-clear indicating reset is complete.
244 * Some PHYs could take up to 3 seconds to complete and need about
245 * 1.7 usec delay after the reset is complete.
247 for (i = 0; i < 30; i++) {
249 err = hw->phy.read_reg(hw, TXGBE_MD_PORT_CTRL,
250 TXGBE_MD_DEV_GENERAL, &ctrl);
254 if (!(ctrl & TXGBE_MD_PORT_CTRL_RESET)) {
260 if (ctrl & TXGBE_MD_PORT_CTRL_RESET) {
261 err = TXGBE_ERR_RESET_FAILED;
262 DEBUGOUT("PHY reset polling failed to complete.\n");
269 * txgbe_reset_phy - Performs a PHY reset
270 * @hw: pointer to hardware structure
272 s32 txgbe_reset_phy(struct txgbe_hw *hw)
276 DEBUGFUNC("txgbe_reset_phy");
278 if (hw->phy.type == txgbe_phy_unknown)
279 err = txgbe_identify_phy(hw);
281 if (err != 0 || hw->phy.type == txgbe_phy_none)
284 /* Don't reset PHY if it's shut down due to overtemp. */
285 if (hw->phy.check_overtemp(hw) == TXGBE_ERR_OVERTEMP)
288 /* Blocked by MNG FW so bail */
289 if (txgbe_check_reset_blocked(hw))
292 switch (hw->phy.type) {
293 case txgbe_phy_cu_mtd:
294 err = txgbe_reset_extphy(hw);
304 * txgbe_read_phy_mdi - Reads a value from a specified PHY register without
306 * @hw: pointer to hardware structure
307 * @reg_addr: 32 bit address of PHY register to read
308 * @device_type: 5 bit device type
309 * @phy_data: Pointer to read data from PHY register
311 s32 txgbe_read_phy_reg_mdi(struct txgbe_hw *hw, u32 reg_addr, u32 device_type,
316 /* Setup and write the address cycle command */
317 command = TXGBE_MDIOSCA_REG(reg_addr) |
318 TXGBE_MDIOSCA_DEV(device_type) |
319 TXGBE_MDIOSCA_PORT(hw->phy.addr);
320 wr32(hw, TXGBE_MDIOSCA, command);
322 command = TXGBE_MDIOSCD_CMD_READ |
324 wr32(hw, TXGBE_MDIOSCD, command);
327 * Check every 10 usec to see if the address cycle completed.
328 * The MDI Command bit will clear when the operation is
331 if (!po32m(hw, TXGBE_MDIOSCD, TXGBE_MDIOSCD_BUSY,
332 0, NULL, 100, 100)) {
333 DEBUGOUT("PHY address command did not complete\n");
334 return TXGBE_ERR_PHY;
337 data = rd32(hw, TXGBE_MDIOSCD);
338 *phy_data = (u16)TXGBD_MDIOSCD_DAT(data);
344 * txgbe_read_phy_reg - Reads a value from a specified PHY register
345 * using the SWFW lock - this function is needed in most cases
346 * @hw: pointer to hardware structure
347 * @reg_addr: 32 bit address of PHY register to read
348 * @device_type: 5 bit device type
349 * @phy_data: Pointer to read data from PHY register
351 s32 txgbe_read_phy_reg(struct txgbe_hw *hw, u32 reg_addr,
352 u32 device_type, u16 *phy_data)
355 u32 gssr = hw->phy.phy_semaphore_mask;
357 DEBUGFUNC("txgbe_read_phy_reg");
359 if (hw->mac.acquire_swfw_sync(hw, gssr))
360 return TXGBE_ERR_SWFW_SYNC;
362 err = hw->phy.read_reg_mdi(hw, reg_addr, device_type, phy_data);
364 hw->mac.release_swfw_sync(hw, gssr);
370 * txgbe_write_phy_reg_mdi - Writes a value to specified PHY register
372 * @hw: pointer to hardware structure
373 * @reg_addr: 32 bit PHY register to write
374 * @device_type: 5 bit device type
375 * @phy_data: Data to write to the PHY register
377 s32 txgbe_write_phy_reg_mdi(struct txgbe_hw *hw, u32 reg_addr,
378 u32 device_type, u16 phy_data)
383 command = TXGBE_MDIOSCA_REG(reg_addr) |
384 TXGBE_MDIOSCA_DEV(device_type) |
385 TXGBE_MDIOSCA_PORT(hw->phy.addr);
386 wr32(hw, TXGBE_MDIOSCA, command);
388 command = TXGBE_MDIOSCD_CMD_WRITE |
389 TXGBE_MDIOSCD_DAT(phy_data) |
391 wr32(hw, TXGBE_MDIOSCD, command);
393 /* wait for completion */
394 if (!po32m(hw, TXGBE_MDIOSCD, TXGBE_MDIOSCD_BUSY,
395 0, NULL, 100, 100)) {
396 TLOG_DEBUG("PHY write cmd didn't complete\n");
404 * txgbe_write_phy_reg - Writes a value to specified PHY register
405 * using SWFW lock- this function is needed in most cases
406 * @hw: pointer to hardware structure
407 * @reg_addr: 32 bit PHY register to write
408 * @device_type: 5 bit device type
409 * @phy_data: Data to write to the PHY register
411 s32 txgbe_write_phy_reg(struct txgbe_hw *hw, u32 reg_addr,
412 u32 device_type, u16 phy_data)
415 u32 gssr = hw->phy.phy_semaphore_mask;
417 DEBUGFUNC("txgbe_write_phy_reg");
419 if (hw->mac.acquire_swfw_sync(hw, gssr))
420 err = TXGBE_ERR_SWFW_SYNC;
422 err = hw->phy.write_reg_mdi(hw, reg_addr, device_type,
424 hw->mac.release_swfw_sync(hw, gssr);
430 * txgbe_setup_phy_link - Set and restart auto-neg
431 * @hw: pointer to hardware structure
433 * Restart auto-negotiation and PHY and waits for completion.
435 s32 txgbe_setup_phy_link(struct txgbe_hw *hw)
438 u16 autoneg_reg = TXGBE_MII_AUTONEG_REG;
439 bool autoneg = false;
442 DEBUGFUNC("txgbe_setup_phy_link");
444 txgbe_get_copper_link_capabilities(hw, &speed, &autoneg);
446 /* Set or unset auto-negotiation 10G advertisement */
447 hw->phy.read_reg(hw, TXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
448 TXGBE_MD_DEV_AUTO_NEG,
451 autoneg_reg &= ~TXGBE_MII_10GBASE_T_ADVERTISE;
452 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_10GB_FULL) &&
453 (speed & TXGBE_LINK_SPEED_10GB_FULL))
454 autoneg_reg |= TXGBE_MII_10GBASE_T_ADVERTISE;
456 hw->phy.write_reg(hw, TXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
457 TXGBE_MD_DEV_AUTO_NEG,
460 hw->phy.read_reg(hw, TXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
461 TXGBE_MD_DEV_AUTO_NEG,
464 /* Set or unset auto-negotiation 5G advertisement */
465 autoneg_reg &= ~TXGBE_MII_5GBASE_T_ADVERTISE;
466 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_5GB_FULL) &&
467 (speed & TXGBE_LINK_SPEED_5GB_FULL))
468 autoneg_reg |= TXGBE_MII_5GBASE_T_ADVERTISE;
470 /* Set or unset auto-negotiation 2.5G advertisement */
471 autoneg_reg &= ~TXGBE_MII_2_5GBASE_T_ADVERTISE;
472 if ((hw->phy.autoneg_advertised &
473 TXGBE_LINK_SPEED_2_5GB_FULL) &&
474 (speed & TXGBE_LINK_SPEED_2_5GB_FULL))
475 autoneg_reg |= TXGBE_MII_2_5GBASE_T_ADVERTISE;
476 /* Set or unset auto-negotiation 1G advertisement */
477 autoneg_reg &= ~TXGBE_MII_1GBASE_T_ADVERTISE;
478 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_1GB_FULL) &&
479 (speed & TXGBE_LINK_SPEED_1GB_FULL))
480 autoneg_reg |= TXGBE_MII_1GBASE_T_ADVERTISE;
482 hw->phy.write_reg(hw, TXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
483 TXGBE_MD_DEV_AUTO_NEG,
486 /* Set or unset auto-negotiation 100M advertisement */
487 hw->phy.read_reg(hw, TXGBE_MII_AUTONEG_ADVERTISE_REG,
488 TXGBE_MD_DEV_AUTO_NEG,
491 autoneg_reg &= ~(TXGBE_MII_100BASE_T_ADVERTISE |
492 TXGBE_MII_100BASE_T_ADVERTISE_HALF);
493 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_100M_FULL) &&
494 (speed & TXGBE_LINK_SPEED_100M_FULL))
495 autoneg_reg |= TXGBE_MII_100BASE_T_ADVERTISE;
497 hw->phy.write_reg(hw, TXGBE_MII_AUTONEG_ADVERTISE_REG,
498 TXGBE_MD_DEV_AUTO_NEG,
501 /* Blocked by MNG FW so don't reset PHY */
502 if (txgbe_check_reset_blocked(hw))
505 /* Restart PHY auto-negotiation. */
506 hw->phy.read_reg(hw, TXGBE_MD_AUTO_NEG_CONTROL,
507 TXGBE_MD_DEV_AUTO_NEG, &autoneg_reg);
509 autoneg_reg |= TXGBE_MII_RESTART;
511 hw->phy.write_reg(hw, TXGBE_MD_AUTO_NEG_CONTROL,
512 TXGBE_MD_DEV_AUTO_NEG, autoneg_reg);
518 * txgbe_setup_phy_link_speed - Sets the auto advertised capabilities
519 * @hw: pointer to hardware structure
520 * @speed: new link speed
521 * @autoneg_wait_to_complete: unused
523 s32 txgbe_setup_phy_link_speed(struct txgbe_hw *hw,
525 bool autoneg_wait_to_complete)
527 UNREFERENCED_PARAMETER(autoneg_wait_to_complete);
529 DEBUGFUNC("txgbe_setup_phy_link_speed");
532 * Clear autoneg_advertised and set new values based on input link
535 hw->phy.autoneg_advertised = 0;
537 if (speed & TXGBE_LINK_SPEED_10GB_FULL)
538 hw->phy.autoneg_advertised |= TXGBE_LINK_SPEED_10GB_FULL;
540 if (speed & TXGBE_LINK_SPEED_5GB_FULL)
541 hw->phy.autoneg_advertised |= TXGBE_LINK_SPEED_5GB_FULL;
543 if (speed & TXGBE_LINK_SPEED_2_5GB_FULL)
544 hw->phy.autoneg_advertised |= TXGBE_LINK_SPEED_2_5GB_FULL;
546 if (speed & TXGBE_LINK_SPEED_1GB_FULL)
547 hw->phy.autoneg_advertised |= TXGBE_LINK_SPEED_1GB_FULL;
549 if (speed & TXGBE_LINK_SPEED_100M_FULL)
550 hw->phy.autoneg_advertised |= TXGBE_LINK_SPEED_100M_FULL;
552 if (speed & TXGBE_LINK_SPEED_10M_FULL)
553 hw->phy.autoneg_advertised |= TXGBE_LINK_SPEED_10M_FULL;
555 /* Setup link based on the new speed settings */
556 hw->phy.setup_link(hw);
562 * txgbe_get_copper_speeds_supported - Get copper link speeds from phy
563 * @hw: pointer to hardware structure
565 * Determines the supported link capabilities by reading the PHY auto
566 * negotiation register.
568 static s32 txgbe_get_copper_speeds_supported(struct txgbe_hw *hw)
573 err = hw->phy.read_reg(hw, TXGBE_MD_PHY_SPEED_ABILITY,
574 TXGBE_MD_DEV_PMA_PMD,
579 if (speed_ability & TXGBE_MD_PHY_SPEED_10G)
580 hw->phy.speeds_supported |= TXGBE_LINK_SPEED_10GB_FULL;
581 if (speed_ability & TXGBE_MD_PHY_SPEED_1G)
582 hw->phy.speeds_supported |= TXGBE_LINK_SPEED_1GB_FULL;
583 if (speed_ability & TXGBE_MD_PHY_SPEED_100M)
584 hw->phy.speeds_supported |= TXGBE_LINK_SPEED_100M_FULL;
590 * txgbe_get_copper_link_capabilities - Determines link capabilities
591 * @hw: pointer to hardware structure
592 * @speed: pointer to link speed
593 * @autoneg: boolean auto-negotiation value
595 s32 txgbe_get_copper_link_capabilities(struct txgbe_hw *hw,
601 DEBUGFUNC("txgbe_get_copper_link_capabilities");
604 if (!hw->phy.speeds_supported)
605 err = txgbe_get_copper_speeds_supported(hw);
607 *speed = hw->phy.speeds_supported;
612 * txgbe_check_phy_link_tnx - Determine link and speed status
613 * @hw: pointer to hardware structure
614 * @speed: current link speed
615 * @link_up: true is link is up, false otherwise
617 * Reads the VS1 register to determine if link is up and the current speed for
620 s32 txgbe_check_phy_link_tnx(struct txgbe_hw *hw, u32 *speed,
625 u32 max_time_out = 10;
630 DEBUGFUNC("txgbe_check_phy_link_tnx");
632 /* Initialize speed and link to default case */
634 *speed = TXGBE_LINK_SPEED_10GB_FULL;
637 * Check current speed and link status of the PHY register.
638 * This is a vendor specific register and may have to
639 * be changed for other copper PHYs.
641 for (time_out = 0; time_out < max_time_out; time_out++) {
643 err = hw->phy.read_reg(hw,
644 TXGBE_MD_VENDOR_SPECIFIC_1_STATUS,
645 TXGBE_MD_DEV_VENDOR_1,
647 phy_link = phy_data & TXGBE_MD_VENDOR_SPECIFIC_1_LINK_STATUS;
648 phy_speed = phy_data &
649 TXGBE_MD_VENDOR_SPECIFIC_1_SPEED_STATUS;
650 if (phy_link == TXGBE_MD_VENDOR_SPECIFIC_1_LINK_STATUS) {
653 TXGBE_MD_VENDOR_SPECIFIC_1_SPEED_STATUS)
654 *speed = TXGBE_LINK_SPEED_1GB_FULL;
663 * txgbe_setup_phy_link_tnx - Set and restart auto-neg
664 * @hw: pointer to hardware structure
666 * Restart auto-negotiation and PHY and waits for completion.
668 s32 txgbe_setup_phy_link_tnx(struct txgbe_hw *hw)
671 u16 autoneg_reg = TXGBE_MII_AUTONEG_REG;
672 bool autoneg = false;
675 DEBUGFUNC("txgbe_setup_phy_link_tnx");
677 txgbe_get_copper_link_capabilities(hw, &speed, &autoneg);
679 if (speed & TXGBE_LINK_SPEED_10GB_FULL) {
680 /* Set or unset auto-negotiation 10G advertisement */
681 hw->phy.read_reg(hw, TXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
682 TXGBE_MD_DEV_AUTO_NEG,
685 autoneg_reg &= ~TXGBE_MII_10GBASE_T_ADVERTISE;
686 if (hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_10GB_FULL)
687 autoneg_reg |= TXGBE_MII_10GBASE_T_ADVERTISE;
689 hw->phy.write_reg(hw, TXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
690 TXGBE_MD_DEV_AUTO_NEG,
694 if (speed & TXGBE_LINK_SPEED_1GB_FULL) {
695 /* Set or unset auto-negotiation 1G advertisement */
696 hw->phy.read_reg(hw, TXGBE_MII_AUTONEG_XNP_TX_REG,
697 TXGBE_MD_DEV_AUTO_NEG,
700 autoneg_reg &= ~TXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
701 if (hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_1GB_FULL)
702 autoneg_reg |= TXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
704 hw->phy.write_reg(hw, TXGBE_MII_AUTONEG_XNP_TX_REG,
705 TXGBE_MD_DEV_AUTO_NEG,
709 if (speed & TXGBE_LINK_SPEED_100M_FULL) {
710 /* Set or unset auto-negotiation 100M advertisement */
711 hw->phy.read_reg(hw, TXGBE_MII_AUTONEG_ADVERTISE_REG,
712 TXGBE_MD_DEV_AUTO_NEG,
715 autoneg_reg &= ~TXGBE_MII_100BASE_T_ADVERTISE;
716 if (hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_100M_FULL)
717 autoneg_reg |= TXGBE_MII_100BASE_T_ADVERTISE;
719 hw->phy.write_reg(hw, TXGBE_MII_AUTONEG_ADVERTISE_REG,
720 TXGBE_MD_DEV_AUTO_NEG,
724 /* Blocked by MNG FW so don't reset PHY */
725 if (txgbe_check_reset_blocked(hw))
728 /* Restart PHY auto-negotiation. */
729 hw->phy.read_reg(hw, TXGBE_MD_AUTO_NEG_CONTROL,
730 TXGBE_MD_DEV_AUTO_NEG, &autoneg_reg);
732 autoneg_reg |= TXGBE_MII_RESTART;
734 hw->phy.write_reg(hw, TXGBE_MD_AUTO_NEG_CONTROL,
735 TXGBE_MD_DEV_AUTO_NEG, autoneg_reg);
741 * txgbe_identify_module - Identifies module type
742 * @hw: pointer to hardware structure
744 * Determines HW type and calls appropriate function.
746 s32 txgbe_identify_module(struct txgbe_hw *hw)
748 s32 err = TXGBE_ERR_SFP_NOT_PRESENT;
750 DEBUGFUNC("txgbe_identify_module");
752 switch (hw->phy.media_type) {
753 case txgbe_media_type_fiber:
754 err = txgbe_identify_sfp_module(hw);
757 case txgbe_media_type_fiber_qsfp:
758 err = txgbe_identify_qsfp_module(hw);
762 hw->phy.sfp_type = txgbe_sfp_type_not_present;
763 err = TXGBE_ERR_SFP_NOT_PRESENT;
771 * txgbe_identify_sfp_module - Identifies SFP modules
772 * @hw: pointer to hardware structure
774 * Searches for and identifies the SFP module and assigns appropriate PHY type.
776 s32 txgbe_identify_sfp_module(struct txgbe_hw *hw)
778 s32 err = TXGBE_ERR_PHY_ADDR_INVALID;
780 enum txgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
782 u8 comp_codes_1g = 0;
783 u8 comp_codes_10g = 0;
784 u8 oui_bytes[3] = {0, 0, 0};
789 DEBUGFUNC("txgbe_identify_sfp_module");
791 if (hw->phy.media_type != txgbe_media_type_fiber) {
792 hw->phy.sfp_type = txgbe_sfp_type_not_present;
793 return TXGBE_ERR_SFP_NOT_PRESENT;
796 err = hw->phy.read_i2c_eeprom(hw, TXGBE_SFF_IDENTIFIER,
800 hw->phy.sfp_type = txgbe_sfp_type_not_present;
801 if (hw->phy.type != txgbe_phy_nl) {
803 hw->phy.type = txgbe_phy_unknown;
805 return TXGBE_ERR_SFP_NOT_PRESENT;
808 if (identifier != TXGBE_SFF_IDENTIFIER_SFP) {
809 hw->phy.type = txgbe_phy_sfp_unsupported;
810 return TXGBE_ERR_SFP_NOT_SUPPORTED;
813 err = hw->phy.read_i2c_eeprom(hw, TXGBE_SFF_1GBE_COMP_CODES,
818 err = hw->phy.read_i2c_eeprom(hw, TXGBE_SFF_10GBE_COMP_CODES,
823 err = hw->phy.read_i2c_eeprom(hw, TXGBE_SFF_CABLE_TECHNOLOGY,
833 * 3 SFP_DA_CORE0 - chip-specific
834 * 4 SFP_DA_CORE1 - chip-specific
835 * 5 SFP_SR/LR_CORE0 - chip-specific
836 * 6 SFP_SR/LR_CORE1 - chip-specific
837 * 7 SFP_act_lmt_DA_CORE0 - chip-specific
838 * 8 SFP_act_lmt_DA_CORE1 - chip-specific
839 * 9 SFP_1g_cu_CORE0 - chip-specific
840 * 10 SFP_1g_cu_CORE1 - chip-specific
841 * 11 SFP_1g_sx_CORE0 - chip-specific
842 * 12 SFP_1g_sx_CORE1 - chip-specific
844 if (cable_tech & TXGBE_SFF_CABLE_DA_PASSIVE) {
845 if (hw->bus.lan_id == 0)
846 hw->phy.sfp_type = txgbe_sfp_type_da_cu_core0;
848 hw->phy.sfp_type = txgbe_sfp_type_da_cu_core1;
849 } else if (cable_tech & TXGBE_SFF_CABLE_DA_ACTIVE) {
850 err = hw->phy.read_i2c_eeprom(hw,
851 TXGBE_SFF_CABLE_SPEC_COMP, &cable_spec);
854 if (cable_spec & TXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
855 hw->phy.sfp_type = (hw->bus.lan_id == 0
856 ? txgbe_sfp_type_da_act_lmt_core0
857 : txgbe_sfp_type_da_act_lmt_core1);
859 hw->phy.sfp_type = txgbe_sfp_type_unknown;
861 } else if (comp_codes_10g &
862 (TXGBE_SFF_10GBASESR_CAPABLE |
863 TXGBE_SFF_10GBASELR_CAPABLE)) {
864 hw->phy.sfp_type = (hw->bus.lan_id == 0
865 ? txgbe_sfp_type_srlr_core0
866 : txgbe_sfp_type_srlr_core1);
867 } else if (comp_codes_1g & TXGBE_SFF_1GBASET_CAPABLE) {
868 hw->phy.sfp_type = (hw->bus.lan_id == 0
869 ? txgbe_sfp_type_1g_cu_core0
870 : txgbe_sfp_type_1g_cu_core1);
871 } else if (comp_codes_1g & TXGBE_SFF_1GBASESX_CAPABLE) {
872 hw->phy.sfp_type = (hw->bus.lan_id == 0
873 ? txgbe_sfp_type_1g_sx_core0
874 : txgbe_sfp_type_1g_sx_core1);
875 } else if (comp_codes_1g & TXGBE_SFF_1GBASELX_CAPABLE) {
876 hw->phy.sfp_type = (hw->bus.lan_id == 0
877 ? txgbe_sfp_type_1g_lx_core0
878 : txgbe_sfp_type_1g_lx_core1);
880 hw->phy.sfp_type = txgbe_sfp_type_unknown;
883 if (hw->phy.sfp_type != stored_sfp_type)
884 hw->phy.sfp_setup_needed = true;
886 /* Determine if the SFP+ PHY is dual speed or not. */
887 hw->phy.multispeed_fiber = false;
888 if (((comp_codes_1g & TXGBE_SFF_1GBASESX_CAPABLE) &&
889 (comp_codes_10g & TXGBE_SFF_10GBASESR_CAPABLE)) ||
890 ((comp_codes_1g & TXGBE_SFF_1GBASELX_CAPABLE) &&
891 (comp_codes_10g & TXGBE_SFF_10GBASELR_CAPABLE)))
892 hw->phy.multispeed_fiber = true;
894 /* Determine PHY vendor */
895 if (hw->phy.type != txgbe_phy_nl) {
896 hw->phy.id = identifier;
897 err = hw->phy.read_i2c_eeprom(hw,
898 TXGBE_SFF_VENDOR_OUI_BYTE0, &oui_bytes[0]);
902 err = hw->phy.read_i2c_eeprom(hw,
903 TXGBE_SFF_VENDOR_OUI_BYTE1, &oui_bytes[1]);
907 err = hw->phy.read_i2c_eeprom(hw,
908 TXGBE_SFF_VENDOR_OUI_BYTE2, &oui_bytes[2]);
912 vendor_oui = ((u32)oui_bytes[0] << 24) |
913 ((u32)oui_bytes[1] << 16) |
914 ((u32)oui_bytes[2] << 8);
915 switch (vendor_oui) {
916 case TXGBE_SFF_VENDOR_OUI_TYCO:
917 if (cable_tech & TXGBE_SFF_CABLE_DA_PASSIVE)
918 hw->phy.type = txgbe_phy_sfp_tyco_passive;
920 case TXGBE_SFF_VENDOR_OUI_FTL:
921 if (cable_tech & TXGBE_SFF_CABLE_DA_ACTIVE)
922 hw->phy.type = txgbe_phy_sfp_ftl_active;
924 hw->phy.type = txgbe_phy_sfp_ftl;
926 case TXGBE_SFF_VENDOR_OUI_AVAGO:
927 hw->phy.type = txgbe_phy_sfp_avago;
929 case TXGBE_SFF_VENDOR_OUI_INTEL:
930 hw->phy.type = txgbe_phy_sfp_intel;
933 if (cable_tech & TXGBE_SFF_CABLE_DA_PASSIVE)
934 hw->phy.type = txgbe_phy_sfp_unknown_passive;
935 else if (cable_tech & TXGBE_SFF_CABLE_DA_ACTIVE)
936 hw->phy.type = txgbe_phy_sfp_unknown_active;
938 hw->phy.type = txgbe_phy_sfp_unknown;
943 /* Allow any DA cable vendor */
944 if (cable_tech & (TXGBE_SFF_CABLE_DA_PASSIVE |
945 TXGBE_SFF_CABLE_DA_ACTIVE)) {
949 /* Verify supported 1G SFP modules */
950 if (comp_codes_10g == 0 &&
951 !(hw->phy.sfp_type == txgbe_sfp_type_1g_cu_core1 ||
952 hw->phy.sfp_type == txgbe_sfp_type_1g_cu_core0 ||
953 hw->phy.sfp_type == txgbe_sfp_type_1g_lx_core0 ||
954 hw->phy.sfp_type == txgbe_sfp_type_1g_lx_core1 ||
955 hw->phy.sfp_type == txgbe_sfp_type_1g_sx_core0 ||
956 hw->phy.sfp_type == txgbe_sfp_type_1g_sx_core1)) {
957 hw->phy.type = txgbe_phy_sfp_unsupported;
958 return TXGBE_ERR_SFP_NOT_SUPPORTED;
961 hw->mac.get_device_caps(hw, &enforce_sfp);
962 if (!(enforce_sfp & TXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
963 !hw->allow_unsupported_sfp &&
964 !(hw->phy.sfp_type == txgbe_sfp_type_1g_cu_core0 ||
965 hw->phy.sfp_type == txgbe_sfp_type_1g_cu_core1 ||
966 hw->phy.sfp_type == txgbe_sfp_type_1g_lx_core0 ||
967 hw->phy.sfp_type == txgbe_sfp_type_1g_lx_core1 ||
968 hw->phy.sfp_type == txgbe_sfp_type_1g_sx_core0 ||
969 hw->phy.sfp_type == txgbe_sfp_type_1g_sx_core1)) {
970 DEBUGOUT("SFP+ module not supported\n");
971 hw->phy.type = txgbe_phy_sfp_unsupported;
972 return TXGBE_ERR_SFP_NOT_SUPPORTED;
979 * txgbe_identify_qsfp_module - Identifies QSFP modules
980 * @hw: pointer to hardware structure
982 * Searches for and identifies the QSFP module and assigns appropriate PHY type
984 s32 txgbe_identify_qsfp_module(struct txgbe_hw *hw)
986 s32 err = TXGBE_ERR_PHY_ADDR_INVALID;
988 enum txgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
990 u8 comp_codes_1g = 0;
991 u8 comp_codes_10g = 0;
992 u8 oui_bytes[3] = {0, 0, 0};
997 bool active_cable = false;
999 DEBUGFUNC("txgbe_identify_qsfp_module");
1001 if (hw->phy.media_type != txgbe_media_type_fiber_qsfp) {
1002 hw->phy.sfp_type = txgbe_sfp_type_not_present;
1003 err = TXGBE_ERR_SFP_NOT_PRESENT;
1007 err = hw->phy.read_i2c_eeprom(hw, TXGBE_SFF_IDENTIFIER,
1011 hw->phy.sfp_type = txgbe_sfp_type_not_present;
1013 hw->phy.type = txgbe_phy_unknown;
1014 return TXGBE_ERR_SFP_NOT_PRESENT;
1016 if (identifier != TXGBE_SFF_IDENTIFIER_QSFP_PLUS) {
1017 hw->phy.type = txgbe_phy_sfp_unsupported;
1018 err = TXGBE_ERR_SFP_NOT_SUPPORTED;
1022 hw->phy.id = identifier;
1024 err = hw->phy.read_i2c_eeprom(hw, TXGBE_SFF_QSFP_10GBE_COMP,
1030 err = hw->phy.read_i2c_eeprom(hw, TXGBE_SFF_QSFP_1GBE_COMP,
1036 if (comp_codes_10g & TXGBE_SFF_QSFP_DA_PASSIVE_CABLE) {
1037 hw->phy.type = txgbe_phy_qsfp_unknown_passive;
1038 if (hw->bus.lan_id == 0)
1039 hw->phy.sfp_type = txgbe_sfp_type_da_cu_core0;
1041 hw->phy.sfp_type = txgbe_sfp_type_da_cu_core1;
1042 } else if (comp_codes_10g & (TXGBE_SFF_10GBASESR_CAPABLE |
1043 TXGBE_SFF_10GBASELR_CAPABLE)) {
1044 if (hw->bus.lan_id == 0)
1045 hw->phy.sfp_type = txgbe_sfp_type_srlr_core0;
1047 hw->phy.sfp_type = txgbe_sfp_type_srlr_core1;
1049 if (comp_codes_10g & TXGBE_SFF_QSFP_DA_ACTIVE_CABLE)
1050 active_cable = true;
1052 if (!active_cable) {
1053 hw->phy.read_i2c_eeprom(hw,
1054 TXGBE_SFF_QSFP_CONNECTOR,
1057 hw->phy.read_i2c_eeprom(hw,
1058 TXGBE_SFF_QSFP_CABLE_LENGTH,
1061 hw->phy.read_i2c_eeprom(hw,
1062 TXGBE_SFF_QSFP_DEVICE_TECH,
1066 TXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE &&
1068 ((device_tech >> 4) ==
1069 TXGBE_SFF_QSFP_TRANSMITTER_850NM_VCSEL))
1070 active_cable = true;
1074 hw->phy.type = txgbe_phy_qsfp_unknown_active;
1075 if (hw->bus.lan_id == 0)
1077 txgbe_sfp_type_da_act_lmt_core0;
1080 txgbe_sfp_type_da_act_lmt_core1;
1082 /* unsupported module type */
1083 hw->phy.type = txgbe_phy_sfp_unsupported;
1084 err = TXGBE_ERR_SFP_NOT_SUPPORTED;
1089 if (hw->phy.sfp_type != stored_sfp_type)
1090 hw->phy.sfp_setup_needed = true;
1092 /* Determine if the QSFP+ PHY is dual speed or not. */
1093 hw->phy.multispeed_fiber = false;
1094 if (((comp_codes_1g & TXGBE_SFF_1GBASESX_CAPABLE) &&
1095 (comp_codes_10g & TXGBE_SFF_10GBASESR_CAPABLE)) ||
1096 ((comp_codes_1g & TXGBE_SFF_1GBASELX_CAPABLE) &&
1097 (comp_codes_10g & TXGBE_SFF_10GBASELR_CAPABLE)))
1098 hw->phy.multispeed_fiber = true;
1100 /* Determine PHY vendor for optical modules */
1101 if (comp_codes_10g & (TXGBE_SFF_10GBASESR_CAPABLE |
1102 TXGBE_SFF_10GBASELR_CAPABLE)) {
1103 err = hw->phy.read_i2c_eeprom(hw,
1104 TXGBE_SFF_QSFP_VENDOR_OUI_BYTE0,
1110 err = hw->phy.read_i2c_eeprom(hw,
1111 TXGBE_SFF_QSFP_VENDOR_OUI_BYTE1,
1117 err = hw->phy.read_i2c_eeprom(hw,
1118 TXGBE_SFF_QSFP_VENDOR_OUI_BYTE2,
1125 ((oui_bytes[0] << 24) |
1126 (oui_bytes[1] << 16) |
1127 (oui_bytes[2] << 8));
1129 if (vendor_oui == TXGBE_SFF_VENDOR_OUI_INTEL)
1130 hw->phy.type = txgbe_phy_qsfp_intel;
1132 hw->phy.type = txgbe_phy_qsfp_unknown;
1134 hw->mac.get_device_caps(hw, &enforce_sfp);
1135 if (!(enforce_sfp & TXGBE_DEVICE_CAPS_ALLOW_ANY_SFP)) {
1136 /* Make sure we're a supported PHY type */
1137 if (hw->phy.type == txgbe_phy_qsfp_intel) {
1140 if (hw->allow_unsupported_sfp) {
1141 DEBUGOUT("WARNING: Wangxun (R) Network Connections are quality tested using Wangxun (R) Ethernet Optics. "
1142 "Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. "
1143 "Wangxun Corporation is not responsible for any harm caused by using untested modules.\n");
1146 DEBUGOUT("QSFP module not supported\n");
1148 txgbe_phy_sfp_unsupported;
1149 err = TXGBE_ERR_SFP_NOT_SUPPORTED;
1162 * txgbe_read_i2c_eeprom - Reads 8 bit EEPROM word over I2C interface
1163 * @hw: pointer to hardware structure
1164 * @byte_offset: EEPROM byte offset to read
1165 * @eeprom_data: value read
1167 * Performs byte read operation to SFP module's EEPROM over I2C interface.
1169 s32 txgbe_read_i2c_eeprom(struct txgbe_hw *hw, u8 byte_offset,
1172 DEBUGFUNC("txgbe_read_i2c_eeprom");
1174 return hw->phy.read_i2c_byte(hw, byte_offset,
1175 TXGBE_I2C_EEPROM_DEV_ADDR,
1180 * txgbe_read_i2c_sff8472 - Reads 8 bit word over I2C interface
1181 * @hw: pointer to hardware structure
1182 * @byte_offset: byte offset at address 0xA2
1183 * @sff8472_data: value read
1185 * Performs byte read operation to SFP module's SFF-8472 data over I2C
1187 s32 txgbe_read_i2c_sff8472(struct txgbe_hw *hw, u8 byte_offset,
1190 return hw->phy.read_i2c_byte(hw, byte_offset,
1191 TXGBE_I2C_EEPROM_DEV_ADDR2,
1196 * txgbe_write_i2c_eeprom - Writes 8 bit EEPROM word over I2C interface
1197 * @hw: pointer to hardware structure
1198 * @byte_offset: EEPROM byte offset to write
1199 * @eeprom_data: value to write
1201 * Performs byte write operation to SFP module's EEPROM over I2C interface.
1203 s32 txgbe_write_i2c_eeprom(struct txgbe_hw *hw, u8 byte_offset,
1206 DEBUGFUNC("txgbe_write_i2c_eeprom");
1208 return hw->phy.write_i2c_byte(hw, byte_offset,
1209 TXGBE_I2C_EEPROM_DEV_ADDR,
1214 * txgbe_read_i2c_byte_unlocked - Reads 8 bit word over I2C
1215 * @hw: pointer to hardware structure
1216 * @byte_offset: byte offset to read
1217 * @dev_addr: address to read from
1220 * Performs byte read operation to SFP module's EEPROM over I2C interface at
1221 * a specified device address.
1223 s32 txgbe_read_i2c_byte_unlocked(struct txgbe_hw *hw, u8 byte_offset,
1224 u8 dev_addr, u8 *data)
1226 UNREFERENCED_PARAMETER(dev_addr);
1228 DEBUGFUNC("txgbe_read_i2c_byte");
1230 txgbe_i2c_start(hw);
1233 if (!po32m(hw, TXGBE_I2CICR, TXGBE_I2CICR_TXEMPTY,
1234 TXGBE_I2CICR_TXEMPTY, NULL, 100, 100)) {
1235 return -TERR_TIMEOUT;
1239 wr32(hw, TXGBE_I2CDATA,
1240 byte_offset | TXGBE_I2CDATA_STOP);
1241 wr32(hw, TXGBE_I2CDATA, TXGBE_I2CDATA_READ);
1243 /* wait for read complete */
1244 if (!po32m(hw, TXGBE_I2CICR, TXGBE_I2CICR_RXFULL,
1245 TXGBE_I2CICR_RXFULL, NULL, 100, 100)) {
1246 return -TERR_TIMEOUT;
1251 *data = 0xFF & rd32(hw, TXGBE_I2CDATA);
1257 * txgbe_read_i2c_byte - Reads 8 bit word over I2C
1258 * @hw: pointer to hardware structure
1259 * @byte_offset: byte offset to read
1260 * @dev_addr: address to read from
1263 * Performs byte read operation to SFP module's EEPROM over I2C interface at
1264 * a specified device address.
1266 s32 txgbe_read_i2c_byte(struct txgbe_hw *hw, u8 byte_offset,
1267 u8 dev_addr, u8 *data)
1269 u32 swfw_mask = hw->phy.phy_semaphore_mask;
1272 if (hw->mac.acquire_swfw_sync(hw, swfw_mask))
1273 return TXGBE_ERR_SWFW_SYNC;
1274 err = txgbe_read_i2c_byte_unlocked(hw, byte_offset, dev_addr, data);
1275 hw->mac.release_swfw_sync(hw, swfw_mask);
1280 * txgbe_write_i2c_byte_unlocked - Writes 8 bit word over I2C
1281 * @hw: pointer to hardware structure
1282 * @byte_offset: byte offset to write
1283 * @dev_addr: address to write to
1284 * @data: value to write
1286 * Performs byte write operation to SFP module's EEPROM over I2C interface at
1287 * a specified device address.
1289 s32 txgbe_write_i2c_byte_unlocked(struct txgbe_hw *hw, u8 byte_offset,
1290 u8 dev_addr, u8 data)
1292 UNREFERENCED_PARAMETER(dev_addr);
1294 DEBUGFUNC("txgbe_write_i2c_byte");
1296 txgbe_i2c_start(hw);
1299 if (!po32m(hw, TXGBE_I2CICR, TXGBE_I2CICR_TXEMPTY,
1300 TXGBE_I2CICR_TXEMPTY, NULL, 100, 100)) {
1301 return -TERR_TIMEOUT;
1304 wr32(hw, TXGBE_I2CDATA, byte_offset | TXGBE_I2CDATA_STOP);
1305 wr32(hw, TXGBE_I2CDATA, data | TXGBE_I2CDATA_WRITE);
1307 /* wait for write complete */
1308 if (!po32m(hw, TXGBE_I2CICR, TXGBE_I2CICR_RXFULL,
1309 TXGBE_I2CICR_RXFULL, NULL, 100, 100)) {
1310 return -TERR_TIMEOUT;
1318 * txgbe_write_i2c_byte - Writes 8 bit word over I2C
1319 * @hw: pointer to hardware structure
1320 * @byte_offset: byte offset to write
1321 * @dev_addr: address to write to
1322 * @data: value to write
1324 * Performs byte write operation to SFP module's EEPROM over I2C interface at
1325 * a specified device address.
1327 s32 txgbe_write_i2c_byte(struct txgbe_hw *hw, u8 byte_offset,
1328 u8 dev_addr, u8 data)
1330 u32 swfw_mask = hw->phy.phy_semaphore_mask;
1333 if (hw->mac.acquire_swfw_sync(hw, swfw_mask))
1334 return TXGBE_ERR_SWFW_SYNC;
1335 err = txgbe_write_i2c_byte_unlocked(hw, byte_offset, dev_addr, data);
1336 hw->mac.release_swfw_sync(hw, swfw_mask);
1342 * txgbe_i2c_start - Sets I2C start condition
1343 * @hw: pointer to hardware structure
1345 * Sets I2C start condition (High -> Low on SDA while SCL is High)
1347 static void txgbe_i2c_start(struct txgbe_hw *hw)
1349 DEBUGFUNC("txgbe_i2c_start");
1351 wr32(hw, TXGBE_I2CENA, 0);
1353 wr32(hw, TXGBE_I2CCON,
1354 (TXGBE_I2CCON_MENA |
1355 TXGBE_I2CCON_SPEED(1) |
1356 TXGBE_I2CCON_RESTART |
1357 TXGBE_I2CCON_SDIA));
1358 wr32(hw, TXGBE_I2CTAR, TXGBE_I2C_SLAVEADDR);
1359 wr32(hw, TXGBE_I2CSSSCLHCNT, 600);
1360 wr32(hw, TXGBE_I2CSSSCLLCNT, 600);
1361 wr32(hw, TXGBE_I2CRXTL, 0); /* 1byte for rx full signal */
1362 wr32(hw, TXGBE_I2CTXTL, 4);
1363 wr32(hw, TXGBE_I2CSCLTMOUT, 0xFFFFFF);
1364 wr32(hw, TXGBE_I2CSDATMOUT, 0xFFFFFF);
1366 wr32(hw, TXGBE_I2CICM, 0);
1367 wr32(hw, TXGBE_I2CENA, 1);
1371 * txgbe_i2c_stop - Sets I2C stop condition
1372 * @hw: pointer to hardware structure
1374 * Sets I2C stop condition (Low -> High on SDA while SCL is High)
1376 static void txgbe_i2c_stop(struct txgbe_hw *hw)
1378 DEBUGFUNC("txgbe_i2c_stop");
1380 /* wait for completion */
1381 if (!po32m(hw, TXGBE_I2CSTAT, TXGBE_I2CSTAT_MST,
1382 0, NULL, 100, 100)) {
1383 DEBUGFUNC("i2c stop timeout.");
1386 wr32(hw, TXGBE_I2CENA, 0);
1390 txgbe_set_sgmii_an37_ability(struct txgbe_hw *hw)
1394 wr32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1, 0x3002);
1395 wr32_epcs(hw, SR_MII_MMD_AN_CTL, 0x0105);
1396 wr32_epcs(hw, SR_MII_MMD_DIGI_CTL, 0x0200);
1397 value = rd32_epcs(hw, SR_MII_MMD_CTL);
1398 value = (value & ~0x1200) | (0x1 << 12) | (0x1 << 9);
1399 wr32_epcs(hw, SR_MII_MMD_CTL, value);
1404 txgbe_set_link_to_kr(struct txgbe_hw *hw, bool autoneg)
1409 /* 1. Wait xpcs power-up good */
1410 for (i = 0; i < 100; i++) {
1411 if ((rd32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_STATUS) &
1412 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_MASK) ==
1413 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_POWER_GOOD)
1418 err = TXGBE_ERR_XPCS_POWER_UP_FAILED;
1423 /* 2. Disable xpcs AN-73 */
1424 wr32_epcs(hw, SR_AN_CTRL, 0x0);
1425 /* Disable PHY MPLLA for eth mode change(after ECO) */
1426 wr32_ephy(hw, 0x4, 0x243A);
1429 /* Set the eth change_mode bit first in mis_rst register
1430 * for corresponding LAN port
1432 wr32(hw, TXGBE_RST, TXGBE_RST_ETH(hw->bus.lan_id));
1434 /* 3. Set VR_XS_PMA_Gen5_12G_MPLLA_CTRL3 Register
1435 * Bit[10:0](MPLLA_BANDWIDTH) = 11'd123 (default: 11'd16)
1437 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL3,
1438 TXGBE_PHY_MPLLA_CTL3_MULTIPLIER_BW_10GBASER_KR);
1440 /* 4. Set VR_XS_PMA_Gen5_12G_MISC_CTRL0 Register
1441 * Bit[12:8](RX_VREF_CTRL) = 5'hF (default: 5'h11)
1443 wr32_epcs(hw, TXGBE_PHY_MISC_CTL0, 0xCF00);
1445 /* 5. Set VR_XS_PMA_Gen5_12G_RX_EQ_CTRL0 Register
1446 * Bit[15:8](VGA1/2_GAIN_0) = 8'h77
1447 * Bit[7:5](CTLE_POLE_0) = 3'h2
1448 * Bit[4:0](CTLE_BOOST_0) = 4'hA
1450 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0, 0x774A);
1452 /* 6. Set VR_MII_Gen5_12G_RX_GENCTRL3 Register
1453 * Bit[2:0](LOS_TRSHLD_0) = 3'h4 (default: 3)
1455 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL3, 0x0004);
1457 /* 7. Initialize the mode by setting VR XS or PCS MMD Digital
1458 * Control1 Register Bit[15](VR_RST)
1460 wr32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1, 0xA000);
1462 /* Wait phy initialization done */
1463 for (i = 0; i < 100; i++) {
1465 VR_XS_OR_PCS_MMD_DIGI_CTL1) &
1466 VR_XS_OR_PCS_MMD_DIGI_CTL1_VR_RST) == 0)
1471 err = TXGBE_ERR_PHY_INIT_NOT_DONE;
1475 wr32_epcs(hw, VR_AN_KR_MODE_CL, 0x1);
1482 txgbe_set_link_to_kx4(struct txgbe_hw *hw, bool autoneg)
1488 /* Check link status, if already set, skip setting it again */
1489 if (hw->link_status == TXGBE_LINK_STATUS_KX4)
1492 /* 1. Wait xpcs power-up good */
1493 for (i = 0; i < 100; i++) {
1494 if ((rd32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_STATUS) &
1495 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_MASK) ==
1496 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_POWER_GOOD)
1501 err = TXGBE_ERR_XPCS_POWER_UP_FAILED;
1505 wr32m(hw, TXGBE_MACTXCFG, TXGBE_MACTXCFG_TXE,
1506 ~TXGBE_MACTXCFG_TXE);
1508 /* 2. Disable xpcs AN-73 */
1510 wr32_epcs(hw, SR_AN_CTRL, 0x0);
1512 wr32_epcs(hw, SR_AN_CTRL, 0x3000);
1514 /* Disable PHY MPLLA for eth mode change(after ECO) */
1515 wr32_ephy(hw, 0x4, 0x250A);
1519 /* Set the eth change_mode bit first in mis_rst register
1520 * for corresponding LAN port
1522 wr32(hw, TXGBE_RST, TXGBE_RST_ETH(hw->bus.lan_id));
1524 /* Set SR PCS Control2 Register Bits[1:0] = 2'b01
1525 * PCS_TYPE_SEL: non KR
1527 wr32_epcs(hw, SR_XS_PCS_CTRL2,
1528 SR_PCS_CTRL2_TYPE_SEL_X);
1530 /* Set SR PMA MMD Control1 Register Bit[13] = 1'b1
1533 wr32_epcs(hw, SR_PMA_CTRL1,
1534 SR_PMA_CTRL1_SS13_KX4);
1536 value = (0xf5f0 & ~0x7F0) | (0x5 << 8) | (0x7 << 5) | 0x10;
1537 wr32_epcs(hw, TXGBE_PHY_TX_GENCTRL1, value);
1539 wr32_epcs(hw, TXGBE_PHY_MISC_CTL0, 0x4F00);
1541 value = (0x1804 & ~0x3F3F);
1542 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL0, value);
1544 value = (0x50 & ~0x7F) | 40 | (1 << 6);
1545 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL1, value);
1547 for (i = 0; i < 4; i++) {
1549 value = (0x45 & ~0xFFFF) | (0x7 << 12) |
1552 value = (0xff06 & ~0xFFFF) | (0x7 << 12) |
1554 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0 + i, value);
1557 value = 0x0 & ~0x7777;
1558 wr32_epcs(hw, TXGBE_PHY_RX_EQ_ATT_LVL0, value);
1560 wr32_epcs(hw, TXGBE_PHY_DFE_TAP_CTL0, 0x0);
1562 value = (0x6db & ~0xFFF) | (0x1 << 9) | (0x1 << 6) | (0x1 << 3) | 0x1;
1563 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL3, value);
1565 /* Set VR XS, PMA, or MII Gen5 12G PHY MPLLA
1566 * Control 0 Register Bit[7:0] = 8'd40 //MPLLA_MULTIPLIER
1568 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL0,
1569 TXGBE_PHY_MPLLA_CTL0_MULTIPLIER_OTHER);
1571 /* Set VR XS, PMA or MII Gen5 12G PHY MPLLA
1572 * Control 3 Register Bit[10:0] = 11'd86 //MPLLA_BANDWIDTH
1574 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL3,
1575 TXGBE_PHY_MPLLA_CTL3_MULTIPLIER_BW_OTHER);
1577 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1578 * Calibration Load 0 Register Bit[12:0] = 13'd1360 //VCO_LD_VAL_0
1580 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD0,
1581 TXGBE_PHY_VCO_CAL_LD0_OTHER);
1583 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1584 * Calibration Load 1 Register Bit[12:0] = 13'd1360 //VCO_LD_VAL_1
1586 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD1,
1587 TXGBE_PHY_VCO_CAL_LD0_OTHER);
1589 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1590 * Calibration Load 2 Register Bit[12:0] = 13'd1360 //VCO_LD_VAL_2
1592 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD2,
1593 TXGBE_PHY_VCO_CAL_LD0_OTHER);
1594 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1595 * Calibration Load 3 Register Bit[12:0] = 13'd1360 //VCO_LD_VAL_3
1597 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD3,
1598 TXGBE_PHY_VCO_CAL_LD0_OTHER);
1599 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1600 * Calibration Reference 0 Register Bit[5:0] = 6'd34 //VCO_REF_LD_0/1
1602 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_REF0, 0x2222);
1604 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1605 * Calibration Reference 1 Register Bit[5:0] = 6'd34 //VCO_REF_LD_2/3
1607 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_REF1, 0x2222);
1609 /* Set VR XS, PMA, or MII Gen5 12G PHY AFE-DFE
1610 * Enable Register Bit[7:0] = 8'd0 //AFE_EN_0/3_1, DFE_EN_0/3_1
1612 wr32_epcs(hw, TXGBE_PHY_AFE_DFE_ENABLE, 0x0);
1614 /* Set VR XS, PMA, or MII Gen5 12G PHY Rx
1615 * Equalization Control 4 Register Bit[3:0] = 4'd0 //CONT_ADAPT_0/3_1
1617 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL, 0x00F0);
1619 /* Set VR XS, PMA, or MII Gen5 12G PHY Tx Rate
1620 * Control Register Bit[14:12], Bit[10:8], Bit[6:4], Bit[2:0],
1621 * all rates to 3'b010 //TX0/1/2/3_RATE
1623 wr32_epcs(hw, TXGBE_PHY_TX_RATE_CTL, 0x2222);
1625 /* Set VR XS, PMA, or MII Gen5 12G PHY Rx Rate
1626 * Control Register Bit[13:12], Bit[9:8], Bit[5:4], Bit[1:0],
1627 * all rates to 2'b10 //RX0/1/2/3_RATE
1629 wr32_epcs(hw, TXGBE_PHY_RX_RATE_CTL, 0x2222);
1631 /* Set VR XS, PMA, or MII Gen5 12G PHY Tx General
1632 * Control 2 Register Bit[15:8] = 2'b01 //TX0/1/2/3_WIDTH: 10bits
1634 wr32_epcs(hw, TXGBE_PHY_TX_GEN_CTL2, 0x5500);
1636 /* Set VR XS, PMA, or MII Gen5 12G PHY Rx General
1637 * Control 2 Register Bit[15:8] = 2'b01 //RX0/1/2/3_WIDTH: 10bits
1639 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL2, 0x5500);
1641 /* Set VR XS, PMA, or MII Gen5 12G PHY MPLLA Control
1642 * 2 Register Bit[10:8] = 3'b010
1643 * MPLLA_DIV16P5_CLK_EN=0, MPLLA_DIV10_CLK_EN=1, MPLLA_DIV8_CLK_EN=0
1645 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL2,
1646 TXGBE_PHY_MPLLA_CTL2_DIV_CLK_EN_10);
1648 wr32_epcs(hw, 0x1f0000, 0x0);
1649 wr32_epcs(hw, 0x1f8001, 0x0);
1650 wr32_epcs(hw, SR_MII_MMD_DIGI_CTL, 0x0);
1652 /* 10. Initialize the mode by setting VR XS or PCS MMD Digital Control1
1653 * Register Bit[15](VR_RST)
1655 wr32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1, 0xA000);
1657 /* Wait phy initialization done */
1658 for (i = 0; i < 100; i++) {
1659 if ((rd32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1) &
1660 VR_XS_OR_PCS_MMD_DIGI_CTL1_VR_RST) == 0)
1665 /* If success, set link status */
1666 hw->link_status = TXGBE_LINK_STATUS_KX4;
1669 err = TXGBE_ERR_PHY_INIT_NOT_DONE;
1678 txgbe_set_link_to_kx(struct txgbe_hw *hw,
1687 /* Check link status, if already set, skip setting it again */
1688 if (hw->link_status == TXGBE_LINK_STATUS_KX)
1691 /* 1. Wait xpcs power-up good */
1692 for (i = 0; i < 100; i++) {
1693 if ((rd32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_STATUS) &
1694 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_MASK) ==
1695 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_POWER_GOOD)
1700 err = TXGBE_ERR_XPCS_POWER_UP_FAILED;
1704 wr32m(hw, TXGBE_MACTXCFG, TXGBE_MACTXCFG_TXE,
1705 ~TXGBE_MACTXCFG_TXE);
1707 /* 2. Disable xpcs AN-73 */
1709 wr32_epcs(hw, SR_AN_CTRL, 0x0);
1711 wr32_epcs(hw, SR_AN_CTRL, 0x3000);
1713 /* Disable PHY MPLLA for eth mode change(after ECO) */
1714 wr32_ephy(hw, 0x4, 0x240A);
1718 /* Set the eth change_mode bit first in mis_rst register
1719 * for corresponding LAN port
1721 wr32(hw, TXGBE_RST, TXGBE_RST_ETH(hw->bus.lan_id));
1723 /* Set SR PCS Control2 Register Bits[1:0] = 2'b01
1724 * PCS_TYPE_SEL: non KR
1726 wr32_epcs(hw, SR_XS_PCS_CTRL2,
1727 SR_PCS_CTRL2_TYPE_SEL_X);
1729 /* Set SR PMA MMD Control1 Register Bit[13] = 1'b0
1732 wr32_epcs(hw, SR_PMA_CTRL1,
1733 SR_PMA_CTRL1_SS13_KX);
1735 /* Set SR MII MMD Control Register to corresponding speed: {Bit[6],
1736 * Bit[13]}=[2'b00,2'b01,2'b10]->[10M,100M,1G]
1738 if (speed == TXGBE_LINK_SPEED_100M_FULL)
1740 else if (speed == TXGBE_LINK_SPEED_1GB_FULL)
1742 else if (speed == TXGBE_LINK_SPEED_10M_FULL)
1744 wr32_epcs(hw, SR_MII_MMD_CTL,
1747 value = (0xf5f0 & ~0x710) | (0x5 << 8);
1748 wr32_epcs(hw, TXGBE_PHY_TX_GENCTRL1, value);
1750 wr32_epcs(hw, TXGBE_PHY_MISC_CTL0, 0x4F00);
1752 value = (0x1804 & ~0x3F3F) | (24 << 8) | 4;
1753 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL0, value);
1755 value = (0x50 & ~0x7F) | 16 | (1 << 6);
1756 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL1, value);
1758 for (i = 0; i < 4; i++) {
1762 value = (0x45 & ~0xFFFF) | (0x7 << 12) |
1765 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0 + i, value);
1769 wr32_epcs(hw, TXGBE_PHY_RX_EQ_ATT_LVL0, value);
1771 wr32_epcs(hw, TXGBE_PHY_DFE_TAP_CTL0, 0x0);
1773 value = (0x6db & ~0x7) | 0x4;
1774 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL3, value);
1776 /* Set VR XS, PMA, or MII Gen5 12G PHY MPLLA Control
1777 * 0 Register Bit[7:0] = 8'd32 //MPLLA_MULTIPLIER
1779 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL0,
1780 TXGBE_PHY_MPLLA_CTL0_MULTIPLIER_1GBASEX_KX);
1782 /* Set VR XS, PMA or MII Gen5 12G PHY MPLLA Control
1783 * 3 Register Bit[10:0] = 11'd70 //MPLLA_BANDWIDTH
1785 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL3,
1786 TXGBE_PHY_MPLLA_CTL3_MULTIPLIER_BW_1GBASEX_KX);
1788 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1789 * Calibration Load 0 Register Bit[12:0] = 13'd1344 //VCO_LD_VAL_0
1791 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD0,
1792 TXGBE_PHY_VCO_CAL_LD0_1GBASEX_KX);
1794 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD1, 0x549);
1795 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD2, 0x549);
1796 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD3, 0x549);
1798 /* Set VR XS, PMA, or MII Gen5 12G PHY VCO
1799 * Calibration Reference 0 Register Bit[5:0] = 6'd42 //VCO_REF_LD_0
1801 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_REF0,
1802 TXGBE_PHY_VCO_CAL_REF0_LD0_1GBASEX_KX);
1804 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_REF1, 0x2929);
1806 /* Set VR XS, PMA, or MII Gen5 12G PHY AFE-DFE
1807 * Enable Register Bit[4], Bit[0] = 1'b0 //AFE_EN_0, DFE_EN_0
1809 wr32_epcs(hw, TXGBE_PHY_AFE_DFE_ENABLE,
1811 /* Set VR XS, PMA, or MII Gen5 12G PHY Rx
1812 * Equalization Control 4 Register Bit[0] = 1'b0 //CONT_ADAPT_0
1814 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL,
1816 /* Set VR XS, PMA, or MII Gen5 12G PHY Tx Rate
1817 * Control Register Bit[2:0] = 3'b011 //TX0_RATE
1819 wr32_epcs(hw, TXGBE_PHY_TX_RATE_CTL,
1820 TXGBE_PHY_TX_RATE_CTL_TX0_RATE_1GBASEX_KX);
1822 /* Set VR XS, PMA, or MII Gen5 12G PHY Rx Rate
1823 * Control Register Bit[2:0] = 3'b011 //RX0_RATE
1825 wr32_epcs(hw, TXGBE_PHY_RX_RATE_CTL,
1826 TXGBE_PHY_RX_RATE_CTL_RX0_RATE_1GBASEX_KX);
1828 /* Set VR XS, PMA, or MII Gen5 12G PHY Tx General
1829 * Control 2 Register Bit[9:8] = 2'b01 //TX0_WIDTH: 10bits
1831 wr32_epcs(hw, TXGBE_PHY_TX_GEN_CTL2,
1832 TXGBE_PHY_TX_GEN_CTL2_TX0_WIDTH_OTHER);
1833 /* Set VR XS, PMA, or MII Gen5 12G PHY Rx General
1834 * Control 2 Register Bit[9:8] = 2'b01 //RX0_WIDTH: 10bits
1836 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL2,
1837 TXGBE_PHY_RX_GEN_CTL2_RX0_WIDTH_OTHER);
1838 /* Set VR XS, PMA, or MII Gen5 12G PHY MPLLA Control
1839 * 2 Register Bit[10:8] = 3'b010 //MPLLA_DIV16P5_CLK_EN=0,
1840 * MPLLA_DIV10_CLK_EN=1, MPLLA_DIV8_CLK_EN=0
1842 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL2,
1843 TXGBE_PHY_MPLLA_CTL2_DIV_CLK_EN_10);
1845 /* VR MII MMD AN Control Register Bit[8] = 1'b1 //MII_CTRL
1846 * Set to 8bit MII (required in 10M/100M SGMII)
1848 wr32_epcs(hw, SR_MII_MMD_AN_CTL,
1851 /* 10. Initialize the mode by setting VR XS or PCS MMD Digital Control1
1852 * Register Bit[15](VR_RST)
1854 wr32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1, 0xA000);
1856 /* Wait phy initialization done */
1857 for (i = 0; i < 100; i++) {
1858 if ((rd32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1) &
1859 VR_XS_OR_PCS_MMD_DIGI_CTL1_VR_RST) == 0)
1864 /* If success, set link status */
1865 hw->link_status = TXGBE_LINK_STATUS_KX;
1868 err = TXGBE_ERR_PHY_INIT_NOT_DONE;
1877 txgbe_set_link_to_sfi(struct txgbe_hw *hw,
1884 /* Set the module link speed */
1885 hw->mac.set_rate_select_speed(hw, speed);
1886 /* 1. Wait xpcs power-up good */
1887 for (i = 0; i < 100; i++) {
1888 if ((rd32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_STATUS) &
1889 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_MASK) ==
1890 VR_XS_OR_PCS_MMD_DIGI_STATUS_PSEQ_POWER_GOOD)
1895 err = TXGBE_ERR_XPCS_POWER_UP_FAILED;
1899 wr32m(hw, TXGBE_MACTXCFG, TXGBE_MACTXCFG_TXE,
1900 ~TXGBE_MACTXCFG_TXE);
1902 /* 2. Disable xpcs AN-73 */
1903 wr32_epcs(hw, SR_AN_CTRL, 0x0);
1905 /* Disable PHY MPLLA for eth mode change(after ECO) */
1906 wr32_ephy(hw, 0x4, 0x243A);
1909 /* Set the eth change_mode bit first in mis_rst register
1910 * for corresponding LAN port
1912 wr32(hw, TXGBE_RST, TXGBE_RST_ETH(hw->bus.lan_id));
1914 if (speed == TXGBE_LINK_SPEED_10GB_FULL) {
1915 /* Set SR PCS Control2 Register Bits[1:0] = 2'b00
1918 wr32_epcs(hw, SR_XS_PCS_CTRL2, 0);
1919 value = rd32_epcs(hw, SR_PMA_CTRL1);
1920 value = value | 0x2000;
1921 wr32_epcs(hw, SR_PMA_CTRL1, value);
1922 /* Set VR_XS_PMA_Gen5_12G_MPLLA_CTRL0 Register Bit[7:0] = 8'd33
1925 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL0, 0x0021);
1926 /* 3. Set VR_XS_PMA_Gen5_12G_MPLLA_CTRL3 Register
1927 * Bit[10:0](MPLLA_BANDWIDTH) = 11'd0
1929 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL3, 0);
1930 value = rd32_epcs(hw, TXGBE_PHY_TX_GENCTRL1);
1931 value = (value & ~0x700) | 0x500;
1932 wr32_epcs(hw, TXGBE_PHY_TX_GENCTRL1, value);
1933 /* 4. Set VR_XS_PMA_Gen5_12G_MISC_CTRL0 Register
1934 * Bit[12:8](RX_VREF_CTRL) = 5'hF
1936 wr32_epcs(hw, TXGBE_PHY_MISC_CTL0, 0xCF00);
1937 /* Set VR_XS_PMA_Gen5_12G_VCO_CAL_LD0 Register
1938 * Bit[12:0] = 13'd1353 //VCO_LD_VAL_0
1940 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD0, 0x0549);
1941 /* Set VR_XS_PMA_Gen5_12G_VCO_CAL_REF0 Register
1942 * Bit[5:0] = 6'd41 //VCO_REF_LD_0
1944 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_REF0, 0x0029);
1945 /* Set VR_XS_PMA_Gen5_12G_TX_RATE_CTRL Register
1946 * Bit[2:0] = 3'b000 //TX0_RATE
1948 wr32_epcs(hw, TXGBE_PHY_TX_RATE_CTL, 0);
1949 /* Set VR_XS_PMA_Gen5_12G_RX_RATE_CTRL Register
1950 * Bit[2:0] = 3'b000 //RX0_RATE
1952 wr32_epcs(hw, TXGBE_PHY_RX_RATE_CTL, 0);
1953 /* Set VR_XS_PMA_Gen5_12G_TX_GENCTRL2 Register Bit[9:8] = 2'b11
1956 wr32_epcs(hw, TXGBE_PHY_TX_GEN_CTL2, 0x0300);
1957 /* Set VR_XS_PMA_Gen5_12G_RX_GENCTRL2 Register Bit[9:8] = 2'b11
1960 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL2, 0x0300);
1961 /* Set VR_XS_PMA_Gen5_12G_MPLLA_CTRL2 Register
1962 * Bit[10:8] = 3'b110
1963 * MPLLA_DIV16P5_CLK_EN=1
1964 * MPLLA_DIV10_CLK_EN=1
1965 * MPLLA_DIV8_CLK_EN=0
1967 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL2, 0x0600);
1968 /* 5. Set VR_XS_PMA_Gen5_12G_TX_EQ_CTRL0 Register
1969 * Bit[13:8](TX_EQ_MAIN) = 6'd30, Bit[5:0](TX_EQ_PRE) = 6'd4
1971 value = rd32_epcs(hw, TXGBE_PHY_TX_EQ_CTL0);
1972 value = (value & ~0x3F3F) | (24 << 8) | 4;
1973 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL0, value);
1974 /* 6. Set VR_XS_PMA_Gen5_12G_TX_EQ_CTRL1 Register
1975 * Bit[6](TX_EQ_OVR_RIDE) = 1'b1, Bit[5:0](TX_EQ_POST) = 6'd36
1977 value = rd32_epcs(hw, TXGBE_PHY_TX_EQ_CTL1);
1978 value = (value & ~0x7F) | 16 | (1 << 6);
1979 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL1, value);
1980 if (hw->phy.sfp_type == txgbe_sfp_type_da_cu_core0 ||
1981 hw->phy.sfp_type == txgbe_sfp_type_da_cu_core1) {
1982 /* 7. Set VR_XS_PMA_Gen5_12G_RX_EQ_CTRL0 Register
1983 * Bit[15:8](VGA1/2_GAIN_0) = 8'h77
1984 * Bit[7:5](CTLE_POLE_0) = 3'h2
1985 * Bit[4:0](CTLE_BOOST_0) = 4'hF
1987 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0, 0x774F);
1990 /* 7. Set VR_XS_PMA_Gen5_12G_RX_EQ_CTRL0 Register
1991 * Bit[15:8](VGA1/2_GAIN_0) = 8'h00
1992 * Bit[7:5](CTLE_POLE_0) = 3'h2
1993 * Bit[4:0](CTLE_BOOST_0) = 4'hA
1995 value = rd32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0);
1996 value = (value & ~0xFFFF) | (2 << 5) | 0x05;
1997 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0, value);
1999 value = rd32_epcs(hw, TXGBE_PHY_RX_EQ_ATT_LVL0);
2000 value = (value & ~0x7) | 0x0;
2001 wr32_epcs(hw, TXGBE_PHY_RX_EQ_ATT_LVL0, value);
2003 if (hw->phy.sfp_type == txgbe_sfp_type_da_cu_core0 ||
2004 hw->phy.sfp_type == txgbe_sfp_type_da_cu_core1) {
2005 /* 8. Set VR_XS_PMA_Gen5_12G_DFE_TAP_CTRL0 Register
2006 * Bit[7:0](DFE_TAP1_0) = 8'd20
2008 wr32_epcs(hw, TXGBE_PHY_DFE_TAP_CTL0, 0x0014);
2009 value = rd32_epcs(hw, TXGBE_PHY_AFE_DFE_ENABLE);
2010 value = (value & ~0x11) | 0x11;
2011 wr32_epcs(hw, TXGBE_PHY_AFE_DFE_ENABLE, value);
2013 /* 8. Set VR_XS_PMA_Gen5_12G_DFE_TAP_CTRL0 Register
2014 * Bit[7:0](DFE_TAP1_0) = 8'd20
2016 wr32_epcs(hw, TXGBE_PHY_DFE_TAP_CTL0, 0xBE);
2017 /* 9. Set VR_MII_Gen5_12G_AFE_DFE_EN_CTRL Register
2018 * Bit[4](DFE_EN_0) = 1'b0, Bit[0](AFE_EN_0) = 1'b0
2020 value = rd32_epcs(hw, TXGBE_PHY_AFE_DFE_ENABLE);
2021 value = (value & ~0x11) | 0x0;
2022 wr32_epcs(hw, TXGBE_PHY_AFE_DFE_ENABLE, value);
2024 value = rd32_epcs(hw, TXGBE_PHY_RX_EQ_CTL);
2025 value = value & ~0x1;
2026 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL, value);
2028 /* Set SR PCS Control2 Register Bits[1:0] = 2'b00
2031 wr32_epcs(hw, SR_XS_PCS_CTRL2, 0x1);
2032 /* Set SR PMA MMD Control1 Register Bit[13] = 1'b0
2035 wr32_epcs(hw, SR_PMA_CTRL1, 0x0000);
2036 /* Set SR MII MMD Control Register to corresponding speed */
2037 wr32_epcs(hw, SR_MII_MMD_CTL, 0x0140);
2039 value = rd32_epcs(hw, TXGBE_PHY_TX_GENCTRL1);
2040 value = (value & ~0x710) | 0x500;
2041 wr32_epcs(hw, TXGBE_PHY_TX_GENCTRL1, value);
2042 /* 4. Set VR_XS_PMA_Gen5_12G_MISC_CTRL0 Register
2043 * Bit[12:8](RX_VREF_CTRL) = 5'hF
2045 wr32_epcs(hw, TXGBE_PHY_MISC_CTL0, 0xCF00);
2046 /* 5. Set VR_XS_PMA_Gen5_12G_TX_EQ_CTRL0 Register
2047 * Bit[13:8](TX_EQ_MAIN) = 6'd30, Bit[5:0](TX_EQ_PRE) = 6'd4
2049 value = rd32_epcs(hw, TXGBE_PHY_TX_EQ_CTL0);
2050 value = (value & ~0x3F3F) | (24 << 8) | 4;
2051 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL0, value);
2052 /* 6. Set VR_XS_PMA_Gen5_12G_TX_EQ_CTRL1 Register Bit[6]
2053 * (TX_EQ_OVR_RIDE) = 1'b1, Bit[5:0](TX_EQ_POST) = 6'd36
2055 value = rd32_epcs(hw, TXGBE_PHY_TX_EQ_CTL1);
2056 value = (value & ~0x7F) | 16 | (1 << 6);
2057 wr32_epcs(hw, TXGBE_PHY_TX_EQ_CTL1, value);
2058 if (hw->phy.sfp_type == txgbe_sfp_type_da_cu_core0 ||
2059 hw->phy.sfp_type == txgbe_sfp_type_da_cu_core1) {
2060 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0, 0x774F);
2062 /* 7. Set VR_XS_PMA_Gen5_12G_RX_EQ_CTRL0 Register
2063 * Bit[15:8](VGA1/2_GAIN_0) = 8'h00
2064 * Bit[7:5](CTLE_POLE_0) = 3'h2
2065 * Bit[4:0](CTLE_BOOST_0) = 4'hA
2067 value = rd32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0);
2068 value = (value & ~0xFFFF) | 0x7706;
2069 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL0, value);
2071 value = rd32_epcs(hw, TXGBE_PHY_RX_EQ_ATT_LVL0);
2072 value = (value & ~0x7) | 0x0;
2073 wr32_epcs(hw, TXGBE_PHY_RX_EQ_ATT_LVL0, value);
2074 /* 8. Set VR_XS_PMA_Gen5_12G_DFE_TAP_CTRL0 Register
2075 * Bit[7:0](DFE_TAP1_0) = 8'd00
2077 wr32_epcs(hw, TXGBE_PHY_DFE_TAP_CTL0, 0x0);
2078 /* 9. Set VR_MII_Gen5_12G_AFE_DFE_EN_CTRL Register
2079 * Bit[4](DFE_EN_0) = 1'b0, Bit[0](AFE_EN_0) = 1'b0
2081 value = rd32_epcs(hw, TXGBE_PHY_RX_GEN_CTL3);
2082 value = (value & ~0x7) | 0x4;
2083 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL3, value);
2084 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL0, 0x0020);
2085 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL3, 0x0046);
2086 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_LD0, 0x0540);
2087 wr32_epcs(hw, TXGBE_PHY_VCO_CAL_REF0, 0x002A);
2088 wr32_epcs(hw, TXGBE_PHY_AFE_DFE_ENABLE, 0x0);
2089 wr32_epcs(hw, TXGBE_PHY_RX_EQ_CTL, 0x0010);
2090 wr32_epcs(hw, TXGBE_PHY_TX_RATE_CTL, 0x0003);
2091 wr32_epcs(hw, TXGBE_PHY_RX_RATE_CTL, 0x0003);
2092 wr32_epcs(hw, TXGBE_PHY_TX_GEN_CTL2, 0x0100);
2093 wr32_epcs(hw, TXGBE_PHY_RX_GEN_CTL2, 0x0100);
2094 wr32_epcs(hw, TXGBE_PHY_MPLLA_CTL2, 0x0200);
2095 wr32_epcs(hw, SR_MII_MMD_AN_CTL, 0x0100);
2097 /* 10. Initialize the mode by setting VR XS or PCS MMD Digital Control1
2098 * Register Bit[15](VR_RST)
2100 wr32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1, 0xA000);
2102 /* Wait phy initialization done */
2103 for (i = 0; i < 100; i++) {
2104 if ((rd32_epcs(hw, VR_XS_OR_PCS_MMD_DIGI_CTL1) &
2105 VR_XS_OR_PCS_MMD_DIGI_CTL1_VR_RST) == 0)
2110 err = TXGBE_ERR_PHY_INIT_NOT_DONE;
2119 * txgbe_autoc_read - Hides MAC differences needed for AUTOC read
2120 * @hw: pointer to hardware structure
2122 u64 txgbe_autoc_read(struct txgbe_hw *hw)
2130 if (hw->phy.multispeed_fiber) {
2131 autoc |= TXGBE_AUTOC_LMS_10G;
2132 } else if (hw->device_id == TXGBE_DEV_ID_RAPTOR_SFP ||
2133 hw->device_id == TXGBE_DEV_ID_WX1820_SFP) {
2134 autoc |= TXGBE_AUTOC_LMS_10G |
2135 TXGBE_AUTOC_10GS_SFI;
2136 } else if (hw->device_id == TXGBE_DEV_ID_RAPTOR_QSFP) {
2138 } else if (hw->device_id == TXGBE_DEV_ID_RAPTOR_XAUI) {
2139 autoc |= TXGBE_AUTOC_LMS_10G_LINK_NO_AN |
2140 TXGBE_AUTOC_10G_XAUI;
2141 hw->phy.link_mode = TXGBE_PHYSICAL_LAYER_10GBASE_T;
2142 } else if (hw->device_id == TXGBE_DEV_ID_RAPTOR_SGMII) {
2143 autoc |= TXGBE_AUTOC_LMS_SGMII_1G_100M;
2144 hw->phy.link_mode = TXGBE_PHYSICAL_LAYER_1000BASE_T |
2145 TXGBE_PHYSICAL_LAYER_100BASE_TX;
2148 if (hw->device_id != TXGBE_DEV_ID_RAPTOR_SGMII)
2151 sr_pcs_ctl = rd32_epcs(hw, SR_XS_PCS_CTRL2);
2152 sr_pma_ctl1 = rd32_epcs(hw, SR_PMA_CTRL1);
2153 sr_an_ctl = rd32_epcs(hw, SR_AN_CTRL);
2154 sr_an_adv_reg2 = rd32_epcs(hw, SR_AN_MMD_ADV_REG2);
2156 if ((sr_pcs_ctl & SR_PCS_CTRL2_TYPE_SEL) == SR_PCS_CTRL2_TYPE_SEL_X &&
2157 (sr_pma_ctl1 & SR_PMA_CTRL1_SS13) == SR_PMA_CTRL1_SS13_KX &&
2158 (sr_an_ctl & SR_AN_CTRL_AN_EN) == 0) {
2159 /* 1G or KX - no backplane auto-negotiation */
2160 autoc |= TXGBE_AUTOC_LMS_1G_LINK_NO_AN |
2162 hw->phy.link_mode = TXGBE_PHYSICAL_LAYER_1000BASE_KX;
2163 } else if ((sr_pcs_ctl & SR_PCS_CTRL2_TYPE_SEL) ==
2164 SR_PCS_CTRL2_TYPE_SEL_X &&
2165 (sr_pma_ctl1 & SR_PMA_CTRL1_SS13) == SR_PMA_CTRL1_SS13_KX4 &&
2166 (sr_an_ctl & SR_AN_CTRL_AN_EN) == 0) {
2167 autoc |= TXGBE_AUTOC_LMS_10G |
2168 TXGBE_AUTOC_10G_KX4;
2169 hw->phy.link_mode = TXGBE_PHYSICAL_LAYER_10GBASE_KX4;
2170 } else if ((sr_pcs_ctl & SR_PCS_CTRL2_TYPE_SEL) ==
2171 SR_PCS_CTRL2_TYPE_SEL_R &&
2172 (sr_an_ctl & SR_AN_CTRL_AN_EN) == 0) {
2173 /* 10 GbE serial link (KR -no backplane auto-negotiation) */
2174 autoc |= TXGBE_AUTOC_LMS_10G |
2175 TXGBE_AUTOC_10GS_KR;
2176 hw->phy.link_mode = TXGBE_PHYSICAL_LAYER_10GBASE_KR;
2177 } else if ((sr_an_ctl & SR_AN_CTRL_AN_EN)) {
2178 /* KX/KX4/KR backplane auto-negotiation enable */
2179 if (sr_an_adv_reg2 & SR_AN_MMD_ADV_REG2_BP_TYPE_KR)
2180 autoc |= TXGBE_AUTOC_10G_KR;
2181 if (sr_an_adv_reg2 & SR_AN_MMD_ADV_REG2_BP_TYPE_KX4)
2182 autoc |= TXGBE_AUTOC_10G_KX4;
2183 if (sr_an_adv_reg2 & SR_AN_MMD_ADV_REG2_BP_TYPE_KX)
2184 autoc |= TXGBE_AUTOC_1G_KX;
2185 autoc |= TXGBE_AUTOC_LMS_KX4_KX_KR;
2186 hw->phy.link_mode = TXGBE_PHYSICAL_LAYER_10GBASE_KR |
2187 TXGBE_PHYSICAL_LAYER_10GBASE_KX4 |
2188 TXGBE_PHYSICAL_LAYER_1000BASE_KX;
2195 * txgbe_autoc_write - Hides MAC differences needed for AUTOC write
2196 * @hw: pointer to hardware structure
2197 * @autoc: value to write to AUTOC
2199 void txgbe_autoc_write(struct txgbe_hw *hw, u64 autoc)
2205 speed = TXGBE_AUTOC_SPEED(autoc);
2206 autoc &= ~TXGBE_AUTOC_SPEED_MASK;
2207 autoneg = (autoc & TXGBE_AUTOC_AUTONEG ? true : false);
2208 autoc &= ~TXGBE_AUTOC_AUTONEG;
2210 if (hw->device_id == TXGBE_DEV_ID_RAPTOR_KR_KX_KX4) {
2212 switch (hw->phy.link_mode) {
2213 case TXGBE_PHYSICAL_LAYER_10GBASE_KR:
2214 txgbe_set_link_to_kr(hw, autoneg);
2216 case TXGBE_PHYSICAL_LAYER_10GBASE_KX4:
2217 txgbe_set_link_to_kx4(hw, autoneg);
2219 case TXGBE_PHYSICAL_LAYER_1000BASE_KX:
2220 txgbe_set_link_to_kx(hw, speed, autoneg);
2226 } else if (hw->device_id == TXGBE_DEV_ID_RAPTOR_XAUI ||
2227 hw->device_id == TXGBE_DEV_ID_RAPTOR_SGMII) {
2228 if (speed == TXGBE_LINK_SPEED_10GB_FULL) {
2229 txgbe_set_link_to_kx4(hw, autoneg);
2231 txgbe_set_link_to_kx(hw, speed, 0);
2232 txgbe_set_sgmii_an37_ability(hw);
2234 } else if (hw->device_id == TXGBE_DEV_ID_RAPTOR_SFP ||
2235 hw->device_id == TXGBE_DEV_ID_WX1820_SFP) {
2236 txgbe_set_link_to_sfi(hw, speed);
2239 if (speed == TXGBE_LINK_SPEED_10GB_FULL)
2240 mactxcfg = TXGBE_MACTXCFG_SPEED_10G;
2241 else if (speed == TXGBE_LINK_SPEED_1GB_FULL)
2242 mactxcfg = TXGBE_MACTXCFG_SPEED_1G;
2244 /* enable mac transmitter */
2245 wr32m(hw, TXGBE_MACTXCFG, TXGBE_MACTXCFG_SPEED_MASK, mactxcfg);