Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: mscc: improved serdes calibration applied to VSC8584

Introduced 'FOJI' serdes calibration in commit 85e97f0b984e
("net: phy: mscc: improved serdes calibration applied to VSC8514")
Now including the VSC8584 family.

Fixes: a5afc1678044a ("net: phy: mscc: add support for VSC8584 PHY.")
Signed-off-by: Bjarni Jonasson <bjarni.jonasson@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Bjarni Jonasson and committed by
David S. Miller
23d12335 df477178

+158 -60
+158 -60
drivers/net/phy/mscc/mscc_main.c
··· 1472 1472 if (ret) 1473 1473 goto out; 1474 1474 1475 + /* Write patch vector 0, to skip IB cal polling */ 1476 + phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED_GPIO); 1477 + reg = MSCC_ROM_TRAP_SERDES_6G_CFG; /* ROM address to trap, for patch vector 0 */ 1478 + ret = phy_base_write(phydev, MSCC_TRAP_ROM_ADDR(1), reg); 1479 + if (ret) 1480 + goto out; 1481 + 1482 + reg = MSCC_RAM_TRAP_SERDES_6G_CFG; /* RAM address to jump to, when patch vector 0 enabled */ 1483 + ret = phy_base_write(phydev, MSCC_PATCH_RAM_ADDR(1), reg); 1484 + if (ret) 1485 + goto out; 1486 + 1487 + reg = phy_base_read(phydev, MSCC_INT_MEM_CNTL); 1488 + reg |= PATCH_VEC_ZERO_EN; /* bit 8, enable patch vector 0 */ 1489 + ret = phy_base_write(phydev, MSCC_INT_MEM_CNTL, reg); 1490 + if (ret) 1491 + goto out; 1492 + 1475 1493 vsc8584_micro_deassert_reset(phydev, true); 1476 1494 1477 1495 out: ··· 1555 1537 vsc85xx_phy_write_page(phydev, MSCC_PHY_PAGE_STANDARD); 1556 1538 } 1557 1539 1540 + static int vsc8584_config_host_serdes(struct phy_device *phydev) 1541 + { 1542 + struct vsc8531_private *vsc8531 = phydev->priv; 1543 + int ret; 1544 + u16 val; 1545 + 1546 + ret = phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, 1547 + MSCC_PHY_PAGE_EXTENDED_GPIO); 1548 + if (ret) 1549 + return ret; 1550 + 1551 + val = phy_base_read(phydev, MSCC_PHY_MAC_CFG_FASTLINK); 1552 + val &= ~MAC_CFG_MASK; 1553 + if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) { 1554 + val |= MAC_CFG_QSGMII; 1555 + } else if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 1556 + val |= MAC_CFG_SGMII; 1557 + } else { 1558 + ret = -EINVAL; 1559 + return ret; 1560 + } 1561 + 1562 + ret = phy_base_write(phydev, MSCC_PHY_MAC_CFG_FASTLINK, val); 1563 + if (ret) 1564 + return ret; 1565 + 1566 + ret = phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, 1567 + MSCC_PHY_PAGE_STANDARD); 1568 + if (ret) 1569 + return ret; 1570 + 1571 + val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT | 1572 + PROC_CMD_READ_MOD_WRITE_PORT; 1573 + if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) 1574 + val |= PROC_CMD_QSGMII_MAC; 1575 + else 1576 + val |= PROC_CMD_SGMII_MAC; 1577 + 1578 + ret = vsc8584_cmd(phydev, val); 1579 + if (ret) 1580 + return ret; 1581 + 1582 + usleep_range(10000, 20000); 1583 + 1584 + /* Disable SerDes for 100Base-FX */ 1585 + ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF | 1586 + PROC_CMD_FIBER_PORT(vsc8531->addr) | 1587 + PROC_CMD_FIBER_DISABLE | 1588 + PROC_CMD_READ_MOD_WRITE_PORT | 1589 + PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_100BASE_FX); 1590 + if (ret) 1591 + return ret; 1592 + 1593 + /* Disable SerDes for 1000Base-X */ 1594 + ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF | 1595 + PROC_CMD_FIBER_PORT(vsc8531->addr) | 1596 + PROC_CMD_FIBER_DISABLE | 1597 + PROC_CMD_READ_MOD_WRITE_PORT | 1598 + PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_1000BASE_X); 1599 + if (ret) 1600 + return ret; 1601 + 1602 + return vsc85xx_sd6g_config_v2(phydev); 1603 + } 1604 + 1605 + static int vsc8574_config_host_serdes(struct phy_device *phydev) 1606 + { 1607 + struct vsc8531_private *vsc8531 = phydev->priv; 1608 + int ret; 1609 + u16 val; 1610 + 1611 + ret = phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, 1612 + MSCC_PHY_PAGE_EXTENDED_GPIO); 1613 + if (ret) 1614 + return ret; 1615 + 1616 + val = phy_base_read(phydev, MSCC_PHY_MAC_CFG_FASTLINK); 1617 + val &= ~MAC_CFG_MASK; 1618 + if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) { 1619 + val |= MAC_CFG_QSGMII; 1620 + } else if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 1621 + val |= MAC_CFG_SGMII; 1622 + } else if (phy_interface_is_rgmii(phydev)) { 1623 + val |= MAC_CFG_RGMII; 1624 + } else { 1625 + ret = -EINVAL; 1626 + return ret; 1627 + } 1628 + 1629 + ret = phy_base_write(phydev, MSCC_PHY_MAC_CFG_FASTLINK, val); 1630 + if (ret) 1631 + return ret; 1632 + 1633 + ret = phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, 1634 + MSCC_PHY_PAGE_STANDARD); 1635 + if (ret) 1636 + return ret; 1637 + 1638 + if (!phy_interface_is_rgmii(phydev)) { 1639 + val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT | 1640 + PROC_CMD_READ_MOD_WRITE_PORT; 1641 + if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) 1642 + val |= PROC_CMD_QSGMII_MAC; 1643 + else 1644 + val |= PROC_CMD_SGMII_MAC; 1645 + 1646 + ret = vsc8584_cmd(phydev, val); 1647 + if (ret) 1648 + return ret; 1649 + 1650 + usleep_range(10000, 20000); 1651 + } 1652 + 1653 + /* Disable SerDes for 100Base-FX */ 1654 + ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF | 1655 + PROC_CMD_FIBER_PORT(vsc8531->addr) | 1656 + PROC_CMD_FIBER_DISABLE | 1657 + PROC_CMD_READ_MOD_WRITE_PORT | 1658 + PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_100BASE_FX); 1659 + if (ret) 1660 + return ret; 1661 + 1662 + /* Disable SerDes for 1000Base-X */ 1663 + return vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF | 1664 + PROC_CMD_FIBER_PORT(vsc8531->addr) | 1665 + PROC_CMD_FIBER_DISABLE | 1666 + PROC_CMD_READ_MOD_WRITE_PORT | 1667 + PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_1000BASE_X); 1668 + } 1669 + 1558 1670 static int vsc8584_config_init(struct phy_device *phydev) 1559 1671 { 1560 1672 struct vsc8531_private *vsc8531 = phydev->priv; ··· 1721 1573 case PHY_ID_VSC8572: 1722 1574 case PHY_ID_VSC8574: 1723 1575 ret = vsc8574_config_pre_init(phydev); 1576 + if (ret) 1577 + goto err; 1578 + ret = vsc8574_config_host_serdes(phydev); 1579 + if (ret) 1580 + goto err; 1724 1581 break; 1725 1582 case PHY_ID_VSC856X: 1726 1583 case PHY_ID_VSC8575: 1727 1584 case PHY_ID_VSC8582: 1728 1585 case PHY_ID_VSC8584: 1729 1586 ret = vsc8584_config_pre_init(phydev); 1587 + if (ret) 1588 + goto err; 1589 + ret = vsc8584_config_host_serdes(phydev); 1590 + if (ret) 1591 + goto err; 1730 1592 break; 1731 1593 default: 1732 1594 ret = -EINVAL; ··· 1746 1588 if (ret) 1747 1589 goto err; 1748 1590 } 1749 - 1750 - ret = phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, 1751 - MSCC_PHY_PAGE_EXTENDED_GPIO); 1752 - if (ret) 1753 - goto err; 1754 - 1755 - val = phy_base_read(phydev, MSCC_PHY_MAC_CFG_FASTLINK); 1756 - val &= ~MAC_CFG_MASK; 1757 - if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) { 1758 - val |= MAC_CFG_QSGMII; 1759 - } else if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 1760 - val |= MAC_CFG_SGMII; 1761 - } else if (phy_interface_is_rgmii(phydev)) { 1762 - val |= MAC_CFG_RGMII; 1763 - } else { 1764 - ret = -EINVAL; 1765 - goto err; 1766 - } 1767 - 1768 - ret = phy_base_write(phydev, MSCC_PHY_MAC_CFG_FASTLINK, val); 1769 - if (ret) 1770 - goto err; 1771 - 1772 - ret = phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, 1773 - MSCC_PHY_PAGE_STANDARD); 1774 - if (ret) 1775 - goto err; 1776 - 1777 - if (!phy_interface_is_rgmii(phydev)) { 1778 - val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT | 1779 - PROC_CMD_READ_MOD_WRITE_PORT; 1780 - if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) 1781 - val |= PROC_CMD_QSGMII_MAC; 1782 - else 1783 - val |= PROC_CMD_SGMII_MAC; 1784 - 1785 - ret = vsc8584_cmd(phydev, val); 1786 - if (ret) 1787 - goto err; 1788 - 1789 - usleep_range(10000, 20000); 1790 - } 1791 - 1792 - /* Disable SerDes for 100Base-FX */ 1793 - ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF | 1794 - PROC_CMD_FIBER_PORT(vsc8531->addr) | 1795 - PROC_CMD_FIBER_DISABLE | 1796 - PROC_CMD_READ_MOD_WRITE_PORT | 1797 - PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_100BASE_FX); 1798 - if (ret) 1799 - goto err; 1800 - 1801 - /* Disable SerDes for 1000Base-X */ 1802 - ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF | 1803 - PROC_CMD_FIBER_PORT(vsc8531->addr) | 1804 - PROC_CMD_FIBER_DISABLE | 1805 - PROC_CMD_READ_MOD_WRITE_PORT | 1806 - PROC_CMD_RST_CONF_PORT | PROC_CMD_FIBER_1000BASE_X); 1807 - if (ret) 1808 - goto err; 1809 1591 1810 1592 phy_unlock_mdio_bus(phydev); 1811 1593