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

net: phy: mscc: macsec initialization

This patch adds support for initializing the MACsec engine found within
some Microsemi PHYs. The engine is initialized in a passthrough mode and
does not modify any incoming or outgoing packet. But thanks to this it
now can be configured to perform MACsec transformations on packets,
which will be supported by a future patch.

The MACsec read and write functions are wrapped into two versions: one
called during the init phase, and the other one later on. This is
because the init functions in the Microsemi PHY driver are called while
the MDIO bus lock is taken.

Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Antoine Tenart and committed by
David S. Miller
1bbe0ecc dcb780fb

+865
+382
drivers/net/phy/mscc.c
··· 18 18 #include <linux/netdevice.h> 19 19 #include <dt-bindings/net/mscc-phy-vsc8531.h> 20 20 21 + #include "mscc_macsec.h" 22 + #include "mscc_mac.h" 23 + #include "mscc_fc_buffer.h" 24 + 21 25 enum rgmii_rx_clock_delay { 22 26 RGMII_RX_CLK_DELAY_0_2_NS = 0, 23 27 RGMII_RX_CLK_DELAY_0_8_NS = 1, ··· 125 121 #define PHY_S6G_PLL_FSM_CTRL_DATA_POS 8 126 122 #define PHY_S6G_PLL_FSM_ENA_POS 7 127 123 124 + #define MSCC_EXT_PAGE_MACSEC_17 17 125 + #define MSCC_EXT_PAGE_MACSEC_18 18 126 + 127 + #define MSCC_EXT_PAGE_MACSEC_19 19 128 + #define MSCC_PHY_MACSEC_19_REG_ADDR(x) (x) 129 + #define MSCC_PHY_MACSEC_19_TARGET(x) ((x) << 12) 130 + #define MSCC_PHY_MACSEC_19_READ BIT(14) 131 + #define MSCC_PHY_MACSEC_19_CMD BIT(15) 132 + 133 + #define MSCC_EXT_PAGE_MACSEC_20 20 134 + #define MSCC_PHY_MACSEC_20_TARGET(x) (x) 135 + enum macsec_bank { 136 + FC_BUFFER = 0x04, 137 + HOST_MAC = 0x05, 138 + LINE_MAC = 0x06, 139 + IP_1588 = 0x0e, 140 + MACSEC_INGR = 0x38, 141 + MACSEC_EGR = 0x3c, 142 + }; 143 + 128 144 #define MSCC_EXT_PAGE_ACCESS 31 129 145 #define MSCC_PHY_PAGE_STANDARD 0x0000 /* Standard registers */ 130 146 #define MSCC_PHY_PAGE_EXTENDED 0x0001 /* Extended registers */ ··· 152 128 #define MSCC_PHY_PAGE_EXTENDED_3 0x0003 /* Extended reg - page 3 */ 153 129 #define MSCC_PHY_PAGE_EXTENDED_4 0x0004 /* Extended reg - page 4 */ 154 130 #define MSCC_PHY_PAGE_CSR_CNTL MSCC_PHY_PAGE_EXTENDED_4 131 + #define MSCC_PHY_PAGE_MACSEC MSCC_PHY_PAGE_EXTENDED_4 155 132 /* Extended reg - GPIO; this is a bank of registers that are shared for all PHYs 156 133 * in the same package. 157 134 */ ··· 1609 1584 return ret; 1610 1585 } 1611 1586 1587 + #if IS_ENABLED(CONFIG_MACSEC) 1588 + static u32 vsc8584_macsec_phy_read(struct phy_device *phydev, 1589 + enum macsec_bank bank, u32 reg) 1590 + { 1591 + u32 val, val_l = 0, val_h = 0; 1592 + unsigned long deadline; 1593 + int rc; 1594 + 1595 + rc = phy_select_page(phydev, MSCC_PHY_PAGE_MACSEC); 1596 + if (rc < 0) 1597 + goto failed; 1598 + 1599 + __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_20, 1600 + MSCC_PHY_MACSEC_20_TARGET(bank >> 2)); 1601 + 1602 + if (bank >> 2 == 0x1) 1603 + /* non-MACsec access */ 1604 + bank &= 0x3; 1605 + else 1606 + bank = 0; 1607 + 1608 + __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_19, 1609 + MSCC_PHY_MACSEC_19_CMD | MSCC_PHY_MACSEC_19_READ | 1610 + MSCC_PHY_MACSEC_19_REG_ADDR(reg) | 1611 + MSCC_PHY_MACSEC_19_TARGET(bank)); 1612 + 1613 + deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS); 1614 + do { 1615 + val = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_19); 1616 + } while (time_before(jiffies, deadline) && !(val & MSCC_PHY_MACSEC_19_CMD)); 1617 + 1618 + val_l = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_17); 1619 + val_h = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_18); 1620 + 1621 + failed: 1622 + phy_restore_page(phydev, rc, rc); 1623 + 1624 + return (val_h << 16) | val_l; 1625 + } 1626 + 1627 + static void vsc8584_macsec_phy_write(struct phy_device *phydev, 1628 + enum macsec_bank bank, u32 reg, u32 val) 1629 + { 1630 + unsigned long deadline; 1631 + int rc; 1632 + 1633 + rc = phy_select_page(phydev, MSCC_PHY_PAGE_MACSEC); 1634 + if (rc < 0) 1635 + goto failed; 1636 + 1637 + __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_20, 1638 + MSCC_PHY_MACSEC_20_TARGET(bank >> 2)); 1639 + 1640 + if ((bank >> 2 == 0x1) || (bank >> 2 == 0x3)) 1641 + bank &= 0x3; 1642 + else 1643 + /* MACsec access */ 1644 + bank = 0; 1645 + 1646 + __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_17, (u16)val); 1647 + __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_18, (u16)(val >> 16)); 1648 + 1649 + __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_19, 1650 + MSCC_PHY_MACSEC_19_CMD | MSCC_PHY_MACSEC_19_REG_ADDR(reg) | 1651 + MSCC_PHY_MACSEC_19_TARGET(bank)); 1652 + 1653 + deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS); 1654 + do { 1655 + val = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_19); 1656 + } while (time_before(jiffies, deadline) && !(val & MSCC_PHY_MACSEC_19_CMD)); 1657 + 1658 + failed: 1659 + phy_restore_page(phydev, rc, rc); 1660 + } 1661 + 1662 + static void vsc8584_macsec_classification(struct phy_device *phydev, 1663 + enum macsec_bank bank) 1664 + { 1665 + /* enable VLAN tag parsing */ 1666 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_SAM_CP_TAG, 1667 + MSCC_MS_SAM_CP_TAG_PARSE_STAG | 1668 + MSCC_MS_SAM_CP_TAG_PARSE_QTAG | 1669 + MSCC_MS_SAM_CP_TAG_PARSE_QINQ); 1670 + } 1671 + 1672 + static void vsc8584_macsec_flow_default_action(struct phy_device *phydev, 1673 + enum macsec_bank bank, 1674 + bool block) 1675 + { 1676 + u32 port = (bank == MACSEC_INGR) ? 1677 + MSCC_MS_PORT_UNCONTROLLED : MSCC_MS_PORT_COMMON; 1678 + u32 action = MSCC_MS_FLOW_BYPASS; 1679 + 1680 + if (block) 1681 + action = MSCC_MS_FLOW_DROP; 1682 + 1683 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_SAM_NM_FLOW_NCP, 1684 + /* MACsec untagged */ 1685 + MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_FLOW_TYPE(action) | 1686 + MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1687 + MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DEST_PORT(port) | 1688 + /* MACsec tagged */ 1689 + MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_FLOW_TYPE(action) | 1690 + MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1691 + MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DEST_PORT(port) | 1692 + /* Bad tag */ 1693 + MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_FLOW_TYPE(action) | 1694 + MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1695 + MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DEST_PORT(port) | 1696 + /* Kay tag */ 1697 + MSCC_MS_SAM_NM_FLOW_NCP_KAY_FLOW_TYPE(action) | 1698 + MSCC_MS_SAM_NM_FLOW_NCP_KAY_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1699 + MSCC_MS_SAM_NM_FLOW_NCP_KAY_DEST_PORT(port)); 1700 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_SAM_NM_FLOW_CP, 1701 + /* MACsec untagged */ 1702 + MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_FLOW_TYPE(action) | 1703 + MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1704 + MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DEST_PORT(port) | 1705 + /* MACsec tagged */ 1706 + MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_FLOW_TYPE(action) | 1707 + MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1708 + MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DEST_PORT(port) | 1709 + /* Bad tag */ 1710 + MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_FLOW_TYPE(action) | 1711 + MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1712 + MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DEST_PORT(port) | 1713 + /* Kay tag */ 1714 + MSCC_MS_SAM_NM_FLOW_NCP_KAY_FLOW_TYPE(action) | 1715 + MSCC_MS_SAM_NM_FLOW_CP_KAY_DROP_ACTION(MSCC_MS_ACTION_DROP) | 1716 + MSCC_MS_SAM_NM_FLOW_CP_KAY_DEST_PORT(port)); 1717 + } 1718 + 1719 + static void vsc8584_macsec_integrity_checks(struct phy_device *phydev, 1720 + enum macsec_bank bank) 1721 + { 1722 + u32 val; 1723 + 1724 + if (bank != MACSEC_INGR) 1725 + return; 1726 + 1727 + /* Set default rules to pass unmatched frames */ 1728 + val = vsc8584_macsec_phy_read(phydev, bank, 1729 + MSCC_MS_PARAMS2_IG_CC_CONTROL); 1730 + val |= MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_CTRL_ACT | 1731 + MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_ACT; 1732 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_PARAMS2_IG_CC_CONTROL, 1733 + val); 1734 + 1735 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_PARAMS2_IG_CP_TAG, 1736 + MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_STAG | 1737 + MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QTAG | 1738 + MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QINQ); 1739 + } 1740 + 1741 + static void vsc8584_macsec_block_init(struct phy_device *phydev, 1742 + enum macsec_bank bank) 1743 + { 1744 + u32 val; 1745 + int i; 1746 + 1747 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_ENA_CFG, 1748 + MSCC_MS_ENA_CFG_SW_RST | 1749 + MSCC_MS_ENA_CFG_MACSEC_BYPASS_ENA); 1750 + 1751 + /* Set the MACsec block out of s/w reset and enable clocks */ 1752 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_ENA_CFG, 1753 + MSCC_MS_ENA_CFG_CLK_ENA); 1754 + 1755 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_STATUS_CONTEXT_CTRL, 1756 + bank == MACSEC_INGR ? 0xe5880214 : 0xe5880218); 1757 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_MISC_CONTROL, 1758 + MSCC_MS_MISC_CONTROL_MC_LATENCY_FIX(bank == MACSEC_INGR ? 57 : 40) | 1759 + MSCC_MS_MISC_CONTROL_XFORM_REC_SIZE(bank == MACSEC_INGR ? 1 : 2)); 1760 + 1761 + /* Clear the counters */ 1762 + val = vsc8584_macsec_phy_read(phydev, bank, MSCC_MS_COUNT_CONTROL); 1763 + val |= MSCC_MS_COUNT_CONTROL_AUTO_CNTR_RESET; 1764 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_COUNT_CONTROL, val); 1765 + 1766 + /* Enable octet increment mode */ 1767 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_PP_CTRL, 1768 + MSCC_MS_PP_CTRL_MACSEC_OCTET_INCR_MODE); 1769 + 1770 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_BLOCK_CTX_UPDATE, 0x3); 1771 + 1772 + val = vsc8584_macsec_phy_read(phydev, bank, MSCC_MS_COUNT_CONTROL); 1773 + val |= MSCC_MS_COUNT_CONTROL_RESET_ALL; 1774 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_COUNT_CONTROL, val); 1775 + 1776 + /* Set the MTU */ 1777 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_NON_VLAN_MTU_CHECK, 1778 + MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMPARE(32761) | 1779 + MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMP_DROP); 1780 + 1781 + for (i = 0; i < 8; i++) 1782 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_VLAN_MTU_CHECK(i), 1783 + MSCC_MS_VLAN_MTU_CHECK_MTU_COMPARE(32761) | 1784 + MSCC_MS_VLAN_MTU_CHECK_MTU_COMP_DROP); 1785 + 1786 + if (bank == MACSEC_EGR) { 1787 + val = vsc8584_macsec_phy_read(phydev, bank, MSCC_MS_INTR_CTRL_STATUS); 1788 + val &= ~MSCC_MS_INTR_CTRL_STATUS_INTR_ENABLE_M; 1789 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_INTR_CTRL_STATUS, val); 1790 + 1791 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_FC_CFG, 1792 + MSCC_MS_FC_CFG_FCBUF_ENA | 1793 + MSCC_MS_FC_CFG_LOW_THRESH(0x1) | 1794 + MSCC_MS_FC_CFG_HIGH_THRESH(0x4) | 1795 + MSCC_MS_FC_CFG_LOW_BYTES_VAL(0x4) | 1796 + MSCC_MS_FC_CFG_HIGH_BYTES_VAL(0x6)); 1797 + } 1798 + 1799 + vsc8584_macsec_classification(phydev, bank); 1800 + vsc8584_macsec_flow_default_action(phydev, bank, false); 1801 + vsc8584_macsec_integrity_checks(phydev, bank); 1802 + 1803 + /* Enable the MACsec block */ 1804 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MS_ENA_CFG, 1805 + MSCC_MS_ENA_CFG_CLK_ENA | 1806 + MSCC_MS_ENA_CFG_MACSEC_ENA | 1807 + MSCC_MS_ENA_CFG_MACSEC_SPEED_MODE(0x5)); 1808 + } 1809 + 1810 + static void vsc8584_macsec_mac_init(struct phy_device *phydev, 1811 + enum macsec_bank bank) 1812 + { 1813 + u32 val; 1814 + int i; 1815 + 1816 + /* Clear host & line stats */ 1817 + for (i = 0; i < 36; i++) 1818 + vsc8584_macsec_phy_write(phydev, bank, 0x1c + i, 0); 1819 + 1820 + val = vsc8584_macsec_phy_read(phydev, bank, 1821 + MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL); 1822 + val &= ~MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_MODE_M; 1823 + val |= MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_MODE(2) | 1824 + MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_VALUE(0xffff); 1825 + vsc8584_macsec_phy_write(phydev, bank, 1826 + MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL, val); 1827 + 1828 + val = vsc8584_macsec_phy_read(phydev, bank, 1829 + MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_2); 1830 + val |= 0xffff; 1831 + vsc8584_macsec_phy_write(phydev, bank, 1832 + MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_2, val); 1833 + 1834 + val = vsc8584_macsec_phy_read(phydev, bank, 1835 + MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL); 1836 + if (bank == HOST_MAC) 1837 + val |= MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_TIMER_ENA | 1838 + MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_FRAME_DROP_ENA; 1839 + else 1840 + val |= MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_REACT_ENA | 1841 + MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_FRAME_DROP_ENA | 1842 + MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_MODE | 1843 + MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_EARLY_PAUSE_DETECT_ENA; 1844 + vsc8584_macsec_phy_write(phydev, bank, 1845 + MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL, val); 1846 + 1847 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MAC_CFG_PKTINF_CFG, 1848 + MSCC_MAC_CFG_PKTINF_CFG_STRIP_FCS_ENA | 1849 + MSCC_MAC_CFG_PKTINF_CFG_INSERT_FCS_ENA | 1850 + MSCC_MAC_CFG_PKTINF_CFG_LPI_RELAY_ENA | 1851 + MSCC_MAC_CFG_PKTINF_CFG_STRIP_PREAMBLE_ENA | 1852 + MSCC_MAC_CFG_PKTINF_CFG_INSERT_PREAMBLE_ENA | 1853 + (bank == HOST_MAC ? 1854 + MSCC_MAC_CFG_PKTINF_CFG_ENABLE_TX_PADDING : 0)); 1855 + 1856 + val = vsc8584_macsec_phy_read(phydev, bank, MSCC_MAC_CFG_MODE_CFG); 1857 + val &= ~MSCC_MAC_CFG_MODE_CFG_DISABLE_DIC; 1858 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MAC_CFG_MODE_CFG, val); 1859 + 1860 + val = vsc8584_macsec_phy_read(phydev, bank, MSCC_MAC_CFG_MAXLEN_CFG); 1861 + val &= ~MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN_M; 1862 + val |= MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN(10240); 1863 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MAC_CFG_MAXLEN_CFG, val); 1864 + 1865 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MAC_CFG_ADV_CHK_CFG, 1866 + MSCC_MAC_CFG_ADV_CHK_CFG_SFD_CHK_ENA | 1867 + MSCC_MAC_CFG_ADV_CHK_CFG_PRM_CHK_ENA | 1868 + MSCC_MAC_CFG_ADV_CHK_CFG_OOR_ERR_ENA | 1869 + MSCC_MAC_CFG_ADV_CHK_CFG_INR_ERR_ENA); 1870 + 1871 + val = vsc8584_macsec_phy_read(phydev, bank, MSCC_MAC_CFG_LFS_CFG); 1872 + val &= ~MSCC_MAC_CFG_LFS_CFG_LFS_MODE_ENA; 1873 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MAC_CFG_LFS_CFG, val); 1874 + 1875 + vsc8584_macsec_phy_write(phydev, bank, MSCC_MAC_CFG_ENA_CFG, 1876 + MSCC_MAC_CFG_ENA_CFG_RX_CLK_ENA | 1877 + MSCC_MAC_CFG_ENA_CFG_TX_CLK_ENA | 1878 + MSCC_MAC_CFG_ENA_CFG_RX_ENA | 1879 + MSCC_MAC_CFG_ENA_CFG_TX_ENA); 1880 + } 1881 + 1882 + /* Must be called with mdio_lock taken */ 1883 + static int vsc8584_macsec_init(struct phy_device *phydev) 1884 + { 1885 + u32 val; 1886 + 1887 + vsc8584_macsec_block_init(phydev, MACSEC_INGR); 1888 + vsc8584_macsec_block_init(phydev, MACSEC_EGR); 1889 + vsc8584_macsec_mac_init(phydev, HOST_MAC); 1890 + vsc8584_macsec_mac_init(phydev, LINE_MAC); 1891 + 1892 + vsc8584_macsec_phy_write(phydev, FC_BUFFER, 1893 + MSCC_FCBUF_FC_READ_THRESH_CFG, 1894 + MSCC_FCBUF_FC_READ_THRESH_CFG_TX_THRESH(4) | 1895 + MSCC_FCBUF_FC_READ_THRESH_CFG_RX_THRESH(5)); 1896 + 1897 + val = vsc8584_macsec_phy_read(phydev, FC_BUFFER, MSCC_FCBUF_MODE_CFG); 1898 + val |= MSCC_FCBUF_MODE_CFG_PAUSE_GEN_ENA | 1899 + MSCC_FCBUF_MODE_CFG_RX_PPM_RATE_ADAPT_ENA | 1900 + MSCC_FCBUF_MODE_CFG_TX_PPM_RATE_ADAPT_ENA; 1901 + vsc8584_macsec_phy_write(phydev, FC_BUFFER, MSCC_FCBUF_MODE_CFG, val); 1902 + 1903 + vsc8584_macsec_phy_write(phydev, FC_BUFFER, MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG, 1904 + MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_THRESH(8) | 1905 + MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_OFFSET(9)); 1906 + 1907 + val = vsc8584_macsec_phy_read(phydev, FC_BUFFER, 1908 + MSCC_FCBUF_TX_DATA_QUEUE_CFG); 1909 + val &= ~(MSCC_FCBUF_TX_DATA_QUEUE_CFG_START_M | 1910 + MSCC_FCBUF_TX_DATA_QUEUE_CFG_END_M); 1911 + val |= MSCC_FCBUF_TX_DATA_QUEUE_CFG_START(0) | 1912 + MSCC_FCBUF_TX_DATA_QUEUE_CFG_END(5119); 1913 + vsc8584_macsec_phy_write(phydev, FC_BUFFER, 1914 + MSCC_FCBUF_TX_DATA_QUEUE_CFG, val); 1915 + 1916 + val = vsc8584_macsec_phy_read(phydev, FC_BUFFER, MSCC_FCBUF_ENA_CFG); 1917 + val |= MSCC_FCBUF_ENA_CFG_TX_ENA | MSCC_FCBUF_ENA_CFG_RX_ENA; 1918 + vsc8584_macsec_phy_write(phydev, FC_BUFFER, MSCC_FCBUF_ENA_CFG, val); 1919 + 1920 + val = vsc8584_macsec_phy_read(phydev, IP_1588, 1921 + MSCC_PROC_0_IP_1588_TOP_CFG_STAT_MODE_CTL); 1922 + val &= ~MSCC_PROC_0_IP_1588_TOP_CFG_STAT_MODE_CTL_PROTOCOL_MODE_M; 1923 + val |= MSCC_PROC_0_IP_1588_TOP_CFG_STAT_MODE_CTL_PROTOCOL_MODE(4); 1924 + vsc8584_macsec_phy_write(phydev, IP_1588, 1925 + MSCC_PROC_0_IP_1588_TOP_CFG_STAT_MODE_CTL, val); 1926 + 1927 + return 0; 1928 + } 1929 + #endif /* CONFIG_MACSEC */ 1930 + 1612 1931 /* Check if one PHY has already done the init of the parts common to all PHYs 1613 1932 * in the Quad PHY package. 1614 1933 */ ··· 2101 1732 goto err; 2102 1733 2103 1734 mutex_unlock(&phydev->mdio.bus->mdio_lock); 1735 + 1736 + #if IS_ENABLED(CONFIG_MACSEC) 1737 + /* MACsec */ 1738 + switch (phydev->phy_id & phydev->drv->phy_id_mask) { 1739 + case PHY_ID_VSC856X: 1740 + case PHY_ID_VSC8575: 1741 + case PHY_ID_VSC8582: 1742 + case PHY_ID_VSC8584: 1743 + ret = vsc8584_macsec_init(phydev); 1744 + if (ret) 1745 + goto err; 1746 + } 1747 + #endif 2104 1748 2105 1749 phy_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD); 2106 1750
+64
drivers/net/phy/mscc_fc_buffer.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 + /* 3 + * Microsemi Ocelot Switch driver 4 + * 5 + * Copyright (C) 2019 Microsemi Corporation 6 + */ 7 + 8 + #ifndef _MSCC_OCELOT_FC_BUFFER_H_ 9 + #define _MSCC_OCELOT_FC_BUFFER_H_ 10 + 11 + #define MSCC_FCBUF_ENA_CFG 0x00 12 + #define MSCC_FCBUF_MODE_CFG 0x01 13 + #define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG 0x02 14 + #define MSCC_FCBUF_TX_CTRL_QUEUE_CFG 0x03 15 + #define MSCC_FCBUF_TX_DATA_QUEUE_CFG 0x04 16 + #define MSCC_FCBUF_RX_DATA_QUEUE_CFG 0x05 17 + #define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG 0x06 18 + #define MSCC_FCBUF_FC_READ_THRESH_CFG 0x07 19 + #define MSCC_FCBUF_TX_FRM_GAP_COMP 0x08 20 + 21 + #define MSCC_FCBUF_ENA_CFG_TX_ENA BIT(0) 22 + #define MSCC_FCBUF_ENA_CFG_RX_ENA BIT(4) 23 + 24 + #define MSCC_FCBUF_MODE_CFG_DROP_BEHAVIOUR BIT(4) 25 + #define MSCC_FCBUF_MODE_CFG_PAUSE_REACT_ENA BIT(8) 26 + #define MSCC_FCBUF_MODE_CFG_RX_PPM_RATE_ADAPT_ENA BIT(12) 27 + #define MSCC_FCBUF_MODE_CFG_TX_PPM_RATE_ADAPT_ENA BIT(16) 28 + #define MSCC_FCBUF_MODE_CFG_TX_CTRL_QUEUE_ENA BIT(20) 29 + #define MSCC_FCBUF_MODE_CFG_PAUSE_GEN_ENA BIT(24) 30 + #define MSCC_FCBUF_MODE_CFG_INCLUDE_PAUSE_RCVD_IN_PAUSE_GEN BIT(28) 31 + 32 + #define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_THRESH(x) (x) 33 + #define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_THRESH_M GENMASK(15, 0) 34 + #define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_OFFSET(x) ((x) << 16) 35 + #define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_OFFSET_M GENMASK(19, 16) 36 + #define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_RX_THRESH(x) ((x) << 20) 37 + #define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_RX_THRESH_M GENMASK(31, 20) 38 + 39 + #define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_START(x) (x) 40 + #define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_START_M GENMASK(15, 0) 41 + #define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_END(x) ((x) << 16) 42 + #define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_END_M GENMASK(31, 16) 43 + 44 + #define MSCC_FCBUF_TX_DATA_QUEUE_CFG_START(x) (x) 45 + #define MSCC_FCBUF_TX_DATA_QUEUE_CFG_START_M GENMASK(15, 0) 46 + #define MSCC_FCBUF_TX_DATA_QUEUE_CFG_END(x) ((x) << 16) 47 + #define MSCC_FCBUF_TX_DATA_QUEUE_CFG_END_M GENMASK(31, 16) 48 + 49 + #define MSCC_FCBUF_RX_DATA_QUEUE_CFG_START(x) (x) 50 + #define MSCC_FCBUF_RX_DATA_QUEUE_CFG_START_M GENMASK(15, 0) 51 + #define MSCC_FCBUF_RX_DATA_QUEUE_CFG_END(x) ((x) << 16) 52 + #define MSCC_FCBUF_RX_DATA_QUEUE_CFG_END_M GENMASK(31, 16) 53 + 54 + #define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XOFF_THRESH(x) (x) 55 + #define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XOFF_THRESH_M GENMASK(15, 0) 56 + #define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XON_THRESH(x) ((x) << 16) 57 + #define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XON_THRESH_M GENMASK(31, 16) 58 + 59 + #define MSCC_FCBUF_FC_READ_THRESH_CFG_TX_THRESH(x) (x) 60 + #define MSCC_FCBUF_FC_READ_THRESH_CFG_TX_THRESH_M GENMASK(15, 0) 61 + #define MSCC_FCBUF_FC_READ_THRESH_CFG_RX_THRESH(x) ((x) << 16) 62 + #define MSCC_FCBUF_FC_READ_THRESH_CFG_RX_THRESH_M GENMASK(31, 16) 63 + 64 + #endif
+159
drivers/net/phy/mscc_mac.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 + /* 3 + * Microsemi Ocelot Switch driver 4 + * 5 + * Copyright (c) 2017 Microsemi Corporation 6 + */ 7 + 8 + #ifndef _MSCC_OCELOT_LINE_MAC_H_ 9 + #define _MSCC_OCELOT_LINE_MAC_H_ 10 + 11 + #define MSCC_MAC_CFG_ENA_CFG 0x00 12 + #define MSCC_MAC_CFG_MODE_CFG 0x01 13 + #define MSCC_MAC_CFG_MAXLEN_CFG 0x02 14 + #define MSCC_MAC_CFG_NUM_TAGS_CFG 0x03 15 + #define MSCC_MAC_CFG_TAGS_CFG 0x04 16 + #define MSCC_MAC_CFG_ADV_CHK_CFG 0x07 17 + #define MSCC_MAC_CFG_LFS_CFG 0x08 18 + #define MSCC_MAC_CFG_LB_CFG 0x09 19 + #define MSCC_MAC_CFG_PKTINF_CFG 0x0a 20 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL 0x0b 21 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_2 0x0c 22 + #define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL 0x0d 23 + #define MSCC_MAC_PAUSE_CFG_STATE 0x0e 24 + #define MSCC_MAC_PAUSE_CFG_MAC_ADDRESS_LSB 0x0f 25 + #define MSCC_MAC_PAUSE_CFG_MAC_ADDRESS_MSB 0x10 26 + #define MSCC_MAC_STATUS_RX_LANE_STICKY_0 0x11 27 + #define MSCC_MAC_STATUS_RX_LANE_STICKY_1 0x12 28 + #define MSCC_MAC_STATUS_TX_MONITOR_STICKY 0x13 29 + #define MSCC_MAC_STATUS_TX_MONITOR_STICKY_MASK 0x14 30 + #define MSCC_MAC_STATUS_STICKY 0x15 31 + #define MSCC_MAC_STATUS_STICKY_MASK 0x16 32 + #define MSCC_MAC_STATS_32BIT_RX_HIH_CKSM_ERR_CNT 0x17 33 + #define MSCC_MAC_STATS_32BIT_RX_XGMII_PROT_ERR_CNT 0x18 34 + #define MSCC_MAC_STATS_32BIT_RX_SYMBOL_ERR_CNT 0x19 35 + #define MSCC_MAC_STATS_32BIT_RX_PAUSE_CNT 0x1a 36 + #define MSCC_MAC_STATS_32BIT_RX_UNSUP_OPCODE_CNT 0x1b 37 + #define MSCC_MAC_STATS_32BIT_RX_UC_CNT 0x1c 38 + #define MSCC_MAC_STATS_32BIT_RX_MC_CNT 0x1d 39 + #define MSCC_MAC_STATS_32BIT_RX_BC_CNT 0x1e 40 + #define MSCC_MAC_STATS_32BIT_RX_CRC_ERR_CNT 0x1f 41 + #define MSCC_MAC_STATS_32BIT_RX_UNDERSIZE_CNT 0x20 42 + #define MSCC_MAC_STATS_32BIT_RX_FRAGMENTS_CNT 0x21 43 + #define MSCC_MAC_STATS_32BIT_RX_IN_RANGE_LEN_ERR_CNT 0x22 44 + #define MSCC_MAC_STATS_32BIT_RX_OUT_OF_RANGE_LEN_ERR_CNT 0x23 45 + #define MSCC_MAC_STATS_32BIT_RX_OVERSIZE_CNT 0x24 46 + #define MSCC_MAC_STATS_32BIT_RX_JABBERS_CNT 0x25 47 + #define MSCC_MAC_STATS_32BIT_RX_SIZE64_CNT 0x26 48 + #define MSCC_MAC_STATS_32BIT_RX_SIZE65TO127_CNT 0x27 49 + #define MSCC_MAC_STATS_32BIT_RX_SIZE128TO255_CNT 0x28 50 + #define MSCC_MAC_STATS_32BIT_RX_SIZE256TO511_CNT 0x29 51 + #define MSCC_MAC_STATS_32BIT_RX_SIZE512TO1023_CNT 0x2a 52 + #define MSCC_MAC_STATS_32BIT_RX_SIZE1024TO1518_CNT 0x2b 53 + #define MSCC_MAC_STATS_32BIT_RX_SIZE1519TOMAX_CNT 0x2c 54 + #define MSCC_MAC_STATS_32BIT_RX_IPG_SHRINK_CNT 0x2d 55 + #define MSCC_MAC_STATS_32BIT_TX_PAUSE_CNT 0x2e 56 + #define MSCC_MAC_STATS_32BIT_TX_UC_CNT 0x2f 57 + #define MSCC_MAC_STATS_32BIT_TX_MC_CNT 0x30 58 + #define MSCC_MAC_STATS_32BIT_TX_BC_CNT 0x31 59 + #define MSCC_MAC_STATS_32BIT_TX_SIZE64_CNT 0x32 60 + #define MSCC_MAC_STATS_32BIT_TX_SIZE65TO127_CNT 0x33 61 + #define MSCC_MAC_STATS_32BIT_TX_SIZE128TO255_CNT 0x34 62 + #define MSCC_MAC_STATS_32BIT_TX_SIZE256TO511_CNT 0x35 63 + #define MSCC_MAC_STATS_32BIT_TX_SIZE512TO1023_CNT 0x36 64 + #define MSCC_MAC_STATS_32BIT_TX_SIZE1024TO1518_CNT 0x37 65 + #define MSCC_MAC_STATS_32BIT_TX_SIZE1519TOMAX_CNT 0x38 66 + #define MSCC_MAC_STATS_40BIT_RX_BAD_BYTES_CNT 0x39 67 + #define MSCC_MAC_STATS_40BIT_RX_BAD_BYTES_MSB_CNT 0x3a 68 + #define MSCC_MAC_STATS_40BIT_RX_OK_BYTES_CNT 0x3b 69 + #define MSCC_MAC_STATS_40BIT_RX_OK_BYTES_MSB_CNT 0x3c 70 + #define MSCC_MAC_STATS_40BIT_RX_IN_BYTES_CNT 0x3d 71 + #define MSCC_MAC_STATS_40BIT_RX_IN_BYTES_MSB_CNT 0x3e 72 + #define MSCC_MAC_STATS_40BIT_TX_OK_BYTES_CNT 0x3f 73 + #define MSCC_MAC_STATS_40BIT_TX_OK_BYTES_MSB_CNT 0x40 74 + #define MSCC_MAC_STATS_40BIT_TX_OUT_BYTES_CNT 0x41 75 + #define MSCC_MAC_STATS_40BIT_TX_OUT_BYTES_MSB_CNT 0x42 76 + 77 + #define MSCC_MAC_CFG_ENA_CFG_RX_CLK_ENA BIT(0) 78 + #define MSCC_MAC_CFG_ENA_CFG_TX_CLK_ENA BIT(4) 79 + #define MSCC_MAC_CFG_ENA_CFG_RX_SW_RST BIT(8) 80 + #define MSCC_MAC_CFG_ENA_CFG_TX_SW_RST BIT(12) 81 + #define MSCC_MAC_CFG_ENA_CFG_RX_ENA BIT(16) 82 + #define MSCC_MAC_CFG_ENA_CFG_TX_ENA BIT(20) 83 + 84 + #define MSCC_MAC_CFG_MODE_CFG_FORCE_CW_UPDATE_INTERVAL(x) ((x) << 20) 85 + #define MSCC_MAC_CFG_MODE_CFG_FORCE_CW_UPDATE_INTERVAL_M GENMASK(29, 20) 86 + #define MSCC_MAC_CFG_MODE_CFG_FORCE_CW_UPDATE BIT(16) 87 + #define MSCC_MAC_CFG_MODE_CFG_TUNNEL_PAUSE_FRAMES BIT(14) 88 + #define MSCC_MAC_CFG_MODE_CFG_MAC_PREAMBLE_CFG(x) ((x) << 10) 89 + #define MSCC_MAC_CFG_MODE_CFG_MAC_PREAMBLE_CFG_M GENMASK(12, 10) 90 + #define MSCC_MAC_CFG_MODE_CFG_MAC_IPG_CFG BIT(6) 91 + #define MSCC_MAC_CFG_MODE_CFG_XGMII_GEN_MODE_ENA BIT(4) 92 + #define MSCC_MAC_CFG_MODE_CFG_HIH_CRC_CHECK BIT(2) 93 + #define MSCC_MAC_CFG_MODE_CFG_UNDERSIZED_FRAME_DROP_DIS BIT(1) 94 + #define MSCC_MAC_CFG_MODE_CFG_DISABLE_DIC BIT(0) 95 + 96 + #define MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN_TAG_CHK BIT(16) 97 + #define MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN(x) (x) 98 + #define MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN_M GENMASK(15, 0) 99 + 100 + #define MSCC_MAC_CFG_TAGS_CFG_RSZ 0x4 101 + #define MSCC_MAC_CFG_TAGS_CFG_TAG_ID(x) ((x) << 16) 102 + #define MSCC_MAC_CFG_TAGS_CFG_TAG_ID_M GENMASK(31, 16) 103 + #define MSCC_MAC_CFG_TAGS_CFG_TAG_ENA BIT(4) 104 + 105 + #define MSCC_MAC_CFG_ADV_CHK_CFG_EXT_EOP_CHK_ENA BIT(24) 106 + #define MSCC_MAC_CFG_ADV_CHK_CFG_EXT_SOP_CHK_ENA BIT(20) 107 + #define MSCC_MAC_CFG_ADV_CHK_CFG_SFD_CHK_ENA BIT(16) 108 + #define MSCC_MAC_CFG_ADV_CHK_CFG_PRM_SHK_CHK_DIS BIT(12) 109 + #define MSCC_MAC_CFG_ADV_CHK_CFG_PRM_CHK_ENA BIT(8) 110 + #define MSCC_MAC_CFG_ADV_CHK_CFG_OOR_ERR_ENA BIT(4) 111 + #define MSCC_MAC_CFG_ADV_CHK_CFG_INR_ERR_ENA BIT(0) 112 + 113 + #define MSCC_MAC_CFG_LFS_CFG_LFS_INH_TX BIT(8) 114 + #define MSCC_MAC_CFG_LFS_CFG_LFS_DIS_TX BIT(4) 115 + #define MSCC_MAC_CFG_LFS_CFG_LFS_UNIDIR_ENA BIT(3) 116 + #define MSCC_MAC_CFG_LFS_CFG_USE_LEADING_EDGE_DETECT BIT(2) 117 + #define MSCC_MAC_CFG_LFS_CFG_SPURIOUS_Q_DIS BIT(1) 118 + #define MSCC_MAC_CFG_LFS_CFG_LFS_MODE_ENA BIT(0) 119 + 120 + #define MSCC_MAC_CFG_LB_CFG_XGMII_HOST_LB_ENA BIT(4) 121 + #define MSCC_MAC_CFG_LB_CFG_XGMII_PHY_LB_ENA BIT(0) 122 + 123 + #define MSCC_MAC_CFG_PKTINF_CFG_STRIP_FCS_ENA BIT(0) 124 + #define MSCC_MAC_CFG_PKTINF_CFG_INSERT_FCS_ENA BIT(4) 125 + #define MSCC_MAC_CFG_PKTINF_CFG_STRIP_PREAMBLE_ENA BIT(8) 126 + #define MSCC_MAC_CFG_PKTINF_CFG_INSERT_PREAMBLE_ENA BIT(12) 127 + #define MSCC_MAC_CFG_PKTINF_CFG_LPI_RELAY_ENA BIT(16) 128 + #define MSCC_MAC_CFG_PKTINF_CFG_LF_RELAY_ENA BIT(20) 129 + #define MSCC_MAC_CFG_PKTINF_CFG_RF_RELAY_ENA BIT(24) 130 + #define MSCC_MAC_CFG_PKTINF_CFG_ENABLE_TX_PADDING BIT(25) 131 + #define MSCC_MAC_CFG_PKTINF_CFG_ENABLE_RX_PADDING BIT(26) 132 + #define MSCC_MAC_CFG_PKTINF_CFG_ENABLE_4BYTE_PREAMBLE BIT(27) 133 + #define MSCC_MAC_CFG_PKTINF_CFG_MACSEC_BYPASS_NUM_PTP_STALL_CLKS(x) ((x) << 28) 134 + #define MSCC_MAC_CFG_PKTINF_CFG_MACSEC_BYPASS_NUM_PTP_STALL_CLKS_M GENMASK(30, 28) 135 + 136 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_VALUE(x) ((x) << 16) 137 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_VALUE_M GENMASK(31, 16) 138 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_WAIT_FOR_LPI_LOW BIT(12) 139 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_USE_PAUSE_STALL_ENA BIT(8) 140 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_REPL_MODE BIT(4) 141 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_FRC_FRAME BIT(2) 142 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_MODE(x) (x) 143 + #define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_MODE_M GENMASK(1, 0) 144 + 145 + #define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_EARLY_PAUSE_DETECT_ENA BIT(16) 146 + #define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PRE_CRC_MODE BIT(20) 147 + #define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_TIMER_ENA BIT(12) 148 + #define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_REACT_ENA BIT(8) 149 + #define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_FRAME_DROP_ENA BIT(4) 150 + #define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_MODE BIT(0) 151 + 152 + #define MSCC_MAC_PAUSE_CFG_STATE_PAUSE_STATE BIT(0) 153 + #define MSCC_MAC_PAUSE_CFG_STATE_MAC_TX_PAUSE_GEN BIT(4) 154 + 155 + #define MSCC_PROC_0_IP_1588_TOP_CFG_STAT_MODE_CTL 0x2 156 + #define MSCC_PROC_0_IP_1588_TOP_CFG_STAT_MODE_CTL_PROTOCOL_MODE(x) (x) 157 + #define MSCC_PROC_0_IP_1588_TOP_CFG_STAT_MODE_CTL_PROTOCOL_MODE_M GENMASK(2, 0) 158 + 159 + #endif /* _MSCC_OCELOT_LINE_MAC_H_ */
+260
drivers/net/phy/mscc_macsec.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 + /* 3 + * Microsemi Ocelot Switch driver 4 + * 5 + * Copyright (c) 2018 Microsemi Corporation 6 + */ 7 + 8 + #ifndef _MSCC_OCELOT_MACSEC_H_ 9 + #define _MSCC_OCELOT_MACSEC_H_ 10 + 11 + #define CONTROL_TYPE_EGRESS 0x6 12 + #define CONTROL_TYPE_INGRESS 0xf 13 + #define CONTROL_IV0 BIT(5) 14 + #define CONTROL_IV1 BIT(6) 15 + #define CONTROL_IV2 BIT(7) 16 + #define CONTROL_UPDATE_SEQ BIT(13) 17 + #define CONTROL_IV_IN_SEQ BIT(14) 18 + #define CONTROL_ENCRYPT_AUTH BIT(15) 19 + #define CONTROL_KEY_IN_CTX BIT(16) 20 + #define CONTROL_CRYPTO_ALG(x) ((x) << 17) 21 + #define CTRYPTO_ALG_AES_CTR_128 0x5 22 + #define CTRYPTO_ALG_AES_CTR_192 0x6 23 + #define CTRYPTO_ALG_AES_CTR_256 0x7 24 + #define CONTROL_DIGEST_TYPE(x) ((x) << 21) 25 + #define CONTROL_AUTH_ALG(x) ((x) << 23) 26 + #define AUTH_ALG_AES_GHAS 0x4 27 + #define CONTROL_AN(x) ((x) << 26) 28 + #define CONTROL_SEQ_TYPE(x) ((x) << 28) 29 + #define CONTROL_SEQ_MASK BIT(30) 30 + #define CONTROL_CONTEXT_ID BIT(31) 31 + 32 + enum mscc_macsec_destination_ports { 33 + MSCC_MS_PORT_COMMON = 0, 34 + MSCC_MS_PORT_RSVD = 1, 35 + MSCC_MS_PORT_CONTROLLED = 2, 36 + MSCC_MS_PORT_UNCONTROLLED = 3, 37 + }; 38 + 39 + enum mscc_macsec_drop_actions { 40 + MSCC_MS_ACTION_BYPASS_CRC = 0, 41 + MSCC_MS_ACTION_BYPASS_BAD = 1, 42 + MSCC_MS_ACTION_DROP = 2, 43 + MSCC_MS_ACTION_BYPASS = 3, 44 + }; 45 + 46 + enum mscc_macsec_flow_types { 47 + MSCC_MS_FLOW_BYPASS = 0, 48 + MSCC_MS_FLOW_DROP = 1, 49 + MSCC_MS_FLOW_INGRESS = 2, 50 + MSCC_MS_FLOW_EGRESS = 3, 51 + }; 52 + 53 + enum mscc_macsec_validate_levels { 54 + MSCC_MS_VALIDATE_DISABLED = 0, 55 + MSCC_MS_VALIDATE_CHECK = 1, 56 + MSCC_MS_VALIDATE_STRICT = 2, 57 + }; 58 + 59 + #define MSCC_MS_XFORM_REC(x, y) (((x) << 5) + (y)) 60 + #define MSCC_MS_ENA_CFG 0x800 61 + #define MSCC_MS_FC_CFG 0x804 62 + #define MSCC_MS_SAM_MISC_MATCH(x) (0x1004 + ((x) << 4)) 63 + #define MSCC_MS_SAM_MATCH_SCI_LO(x) (0x1005 + ((x) << 4)) 64 + #define MSCC_MS_SAM_MATCH_SCI_HI(x) (0x1006 + ((x) << 4)) 65 + #define MSCC_MS_SAM_MASK(x) (0x1007 + ((x) << 4)) 66 + #define MSCC_MS_SAM_ENTRY_SET1 0x1808 67 + #define MSCC_MS_SAM_ENTRY_CLEAR1 0x180c 68 + #define MSCC_MS_SAM_FLOW_CTRL(x) (0x1c00 + (x)) 69 + #define MSCC_MS_SAM_CP_TAG 0x1e40 70 + #define MSCC_MS_SAM_NM_FLOW_NCP 0x1e51 71 + #define MSCC_MS_SAM_NM_FLOW_CP 0x1e52 72 + #define MSCC_MS_MISC_CONTROL 0x1e5f 73 + #define MSCC_MS_COUNT_CONTROL 0x3204 74 + #define MSCC_MS_PARAMS2_IG_CC_CONTROL 0x3a10 75 + #define MSCC_MS_PARAMS2_IG_CP_TAG 0x3a14 76 + #define MSCC_MS_VLAN_MTU_CHECK(x) (0x3c40 + (x)) 77 + #define MSCC_MS_NON_VLAN_MTU_CHECK 0x3c48 78 + #define MSCC_MS_PP_CTRL 0x3c4b 79 + #define MSCC_MS_STATUS_CONTEXT_CTRL 0x3d02 80 + #define MSCC_MS_INTR_CTRL_STATUS 0x3d04 81 + #define MSCC_MS_BLOCK_CTX_UPDATE 0x3d0c 82 + 83 + /* MACSEC_ENA_CFG */ 84 + #define MSCC_MS_ENA_CFG_CLK_ENA BIT(0) 85 + #define MSCC_MS_ENA_CFG_SW_RST BIT(1) 86 + #define MSCC_MS_ENA_CFG_MACSEC_BYPASS_ENA BIT(8) 87 + #define MSCC_MS_ENA_CFG_MACSEC_ENA BIT(9) 88 + #define MSCC_MS_ENA_CFG_MACSEC_SPEED_MODE(x) ((x) << 10) 89 + #define MSCC_MS_ENA_CFG_MACSEC_SPEED_MODE_M GENMASK(12, 10) 90 + 91 + /* MACSEC_FC_CFG */ 92 + #define MSCC_MS_FC_CFG_FCBUF_ENA BIT(0) 93 + #define MSCC_MS_FC_CFG_USE_PKT_EXPANSION_INDICATION BIT(1) 94 + #define MSCC_MS_FC_CFG_LOW_THRESH(x) ((x) << 4) 95 + #define MSCC_MS_FC_CFG_LOW_THRESH_M GENMASK(7, 4) 96 + #define MSCC_MS_FC_CFG_HIGH_THRESH(x) ((x) << 8) 97 + #define MSCC_MS_FC_CFG_HIGH_THRESH_M GENMASK(11, 8) 98 + #define MSCC_MS_FC_CFG_LOW_BYTES_VAL(x) ((x) << 12) 99 + #define MSCC_MS_FC_CFG_LOW_BYTES_VAL_M GENMASK(14, 12) 100 + #define MSCC_MS_FC_CFG_HIGH_BYTES_VAL(x) ((x) << 16) 101 + #define MSCC_MS_FC_CFG_HIGH_BYTES_VAL_M GENMASK(18, 16) 102 + 103 + /* MSCC_MS_SAM_MAC_SA_MATCH_HI */ 104 + #define MSCC_MS_SAM_MAC_SA_MATCH_HI_ETYPE(x) ((x) << 16) 105 + #define MSCC_MS_SAM_MAC_SA_MATCH_HI_ETYPE_M GENMASK(31, 16) 106 + 107 + /* MACSEC_SAM_MISC_MATCH */ 108 + #define MSCC_MS_SAM_MISC_MATCH_VLAN_VALID BIT(0) 109 + #define MSCC_MS_SAM_MISC_MATCH_QINQ_FOUND BIT(1) 110 + #define MSCC_MS_SAM_MISC_MATCH_STAG_VALID BIT(2) 111 + #define MSCC_MS_SAM_MISC_MATCH_QTAG_VALID BIT(3) 112 + #define MSCC_MS_SAM_MISC_MATCH_VLAN_UP(x) ((x) << 4) 113 + #define MSCC_MS_SAM_MISC_MATCH_VLAN_UP_M GENMASK(6, 4) 114 + #define MSCC_MS_SAM_MISC_MATCH_CONTROL_PACKET BIT(7) 115 + #define MSCC_MS_SAM_MISC_MATCH_UNTAGGED BIT(8) 116 + #define MSCC_MS_SAM_MISC_MATCH_TAGGED BIT(9) 117 + #define MSCC_MS_SAM_MISC_MATCH_BAD_TAG BIT(10) 118 + #define MSCC_MS_SAM_MISC_MATCH_KAY_TAG BIT(11) 119 + #define MSCC_MS_SAM_MISC_MATCH_SOURCE_PORT(x) ((x) << 12) 120 + #define MSCC_MS_SAM_MISC_MATCH_SOURCE_PORT_M GENMASK(13, 12) 121 + #define MSCC_MS_SAM_MISC_MATCH_PRIORITY(x) ((x) << 16) 122 + #define MSCC_MS_SAM_MISC_MATCH_PRIORITY_M GENMASK(19, 16) 123 + #define MSCC_MS_SAM_MISC_MATCH_AN(x) ((x) << 24) 124 + #define MSCC_MS_SAM_MISC_MATCH_TCI(x) ((x) << 26) 125 + 126 + /* MACSEC_SAM_MASK */ 127 + #define MSCC_MS_SAM_MASK_MAC_SA_MASK(x) (x) 128 + #define MSCC_MS_SAM_MASK_MAC_SA_MASK_M GENMASK(5, 0) 129 + #define MSCC_MS_SAM_MASK_MAC_DA_MASK(x) ((x) << 6) 130 + #define MSCC_MS_SAM_MASK_MAC_DA_MASK_M GENMASK(11, 6) 131 + #define MSCC_MS_SAM_MASK_MAC_ETYPE_MASK BIT(12) 132 + #define MSCC_MS_SAM_MASK_VLAN_VLD_MASK BIT(13) 133 + #define MSCC_MS_SAM_MASK_QINQ_FOUND_MASK BIT(14) 134 + #define MSCC_MS_SAM_MASK_STAG_VLD_MASK BIT(15) 135 + #define MSCC_MS_SAM_MASK_QTAG_VLD_MASK BIT(16) 136 + #define MSCC_MS_SAM_MASK_VLAN_UP_MASK BIT(17) 137 + #define MSCC_MS_SAM_MASK_VLAN_ID_MASK BIT(18) 138 + #define MSCC_MS_SAM_MASK_SOURCE_PORT_MASK BIT(19) 139 + #define MSCC_MS_SAM_MASK_CTL_PACKET_MASK BIT(20) 140 + #define MSCC_MS_SAM_MASK_VLAN_UP_INNER_MASK BIT(21) 141 + #define MSCC_MS_SAM_MASK_VLAN_ID_INNER_MASK BIT(22) 142 + #define MSCC_MS_SAM_MASK_SCI_MASK BIT(23) 143 + #define MSCC_MS_SAM_MASK_AN_MASK(x) ((x) << 24) 144 + #define MSCC_MS_SAM_MASK_TCI_MASK(x) ((x) << 26) 145 + 146 + /* MACSEC_SAM_FLOW_CTRL_EGR */ 147 + #define MSCC_MS_SAM_FLOW_CTRL_FLOW_TYPE(x) (x) 148 + #define MSCC_MS_SAM_FLOW_CTRL_FLOW_TYPE_M GENMASK(1, 0) 149 + #define MSCC_MS_SAM_FLOW_CTRL_DEST_PORT(x) ((x) << 2) 150 + #define MSCC_MS_SAM_FLOW_CTRL_DEST_PORT_M GENMASK(3, 2) 151 + #define MSCC_MS_SAM_FLOW_CTRL_RESV_4 BIT(4) 152 + #define MSCC_MS_SAM_FLOW_CTRL_FLOW_CRYPT_AUTH BIT(5) 153 + #define MSCC_MS_SAM_FLOW_CTRL_DROP_ACTION(x) ((x) << 6) 154 + #define MSCC_MS_SAM_FLOW_CTRL_DROP_ACTION_M GENMASK(7, 6) 155 + #define MSCC_MS_SAM_FLOW_CTRL_RESV_15_TO_8(x) ((x) << 8) 156 + #define MSCC_MS_SAM_FLOW_CTRL_RESV_15_TO_8_M GENMASK(15, 8) 157 + #define MSCC_MS_SAM_FLOW_CTRL_PROTECT_FRAME BIT(16) 158 + #define MSCC_MS_SAM_FLOW_CTRL_REPLAY_PROTECT BIT(16) 159 + #define MSCC_MS_SAM_FLOW_CTRL_SA_IN_USE BIT(17) 160 + #define MSCC_MS_SAM_FLOW_CTRL_INCLUDE_SCI BIT(18) 161 + #define MSCC_MS_SAM_FLOW_CTRL_USE_ES BIT(19) 162 + #define MSCC_MS_SAM_FLOW_CTRL_USE_SCB BIT(20) 163 + #define MSCC_MS_SAM_FLOW_CTRL_VALIDATE_FRAMES(x) ((x) << 19) 164 + #define MSCC_MS_SAM_FLOW_CTRL_TAG_BYPASS_SIZE(x) ((x) << 21) 165 + #define MSCC_MS_SAM_FLOW_CTRL_TAG_BYPASS_SIZE_M GENMASK(22, 21) 166 + #define MSCC_MS_SAM_FLOW_CTRL_RESV_23 BIT(23) 167 + #define MSCC_MS_SAM_FLOW_CTRL_CONFIDENTIALITY_OFFSET(x) ((x) << 24) 168 + #define MSCC_MS_SAM_FLOW_CTRL_CONFIDENTIALITY_OFFSET_M GENMASK(30, 24) 169 + #define MSCC_MS_SAM_FLOW_CTRL_CONF_PROTECT BIT(31) 170 + 171 + /* MACSEC_SAM_CP_TAG */ 172 + #define MSCC_MS_SAM_CP_TAG_MAP_TBL(x) (x) 173 + #define MSCC_MS_SAM_CP_TAG_MAP_TBL_M GENMASK(23, 0) 174 + #define MSCC_MS_SAM_CP_TAG_DEF_UP(x) ((x) << 24) 175 + #define MSCC_MS_SAM_CP_TAG_DEF_UP_M GENMASK(26, 24) 176 + #define MSCC_MS_SAM_CP_TAG_STAG_UP_EN BIT(27) 177 + #define MSCC_MS_SAM_CP_TAG_QTAG_UP_EN BIT(28) 178 + #define MSCC_MS_SAM_CP_TAG_PARSE_QINQ BIT(29) 179 + #define MSCC_MS_SAM_CP_TAG_PARSE_STAG BIT(30) 180 + #define MSCC_MS_SAM_CP_TAG_PARSE_QTAG BIT(31) 181 + 182 + /* MACSEC_SAM_NM_FLOW_NCP */ 183 + #define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_FLOW_TYPE(x) (x) 184 + #define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DEST_PORT(x) ((x) << 2) 185 + #define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DROP_ACTION(x) ((x) << 6) 186 + #define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_FLOW_TYPE(x) ((x) << 8) 187 + #define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DEST_PORT(x) ((x) << 10) 188 + #define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DROP_ACTION(x) ((x) << 14) 189 + #define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_FLOW_TYPE(x) ((x) << 16) 190 + #define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DEST_PORT(x) ((x) << 18) 191 + #define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DROP_ACTION(x) ((x) << 22) 192 + #define MSCC_MS_SAM_NM_FLOW_NCP_KAY_FLOW_TYPE(x) ((x) << 24) 193 + #define MSCC_MS_SAM_NM_FLOW_NCP_KAY_DEST_PORT(x) ((x) << 26) 194 + #define MSCC_MS_SAM_NM_FLOW_NCP_KAY_DROP_ACTION(x) ((x) << 30) 195 + 196 + /* MACSEC_SAM_NM_FLOW_CP */ 197 + #define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_FLOW_TYPE(x) (x) 198 + #define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DEST_PORT(x) ((x) << 2) 199 + #define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DROP_ACTION(x) ((x) << 6) 200 + #define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_FLOW_TYPE(x) ((x) << 8) 201 + #define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DEST_PORT(x) ((x) << 10) 202 + #define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DROP_ACTION(x) ((x) << 14) 203 + #define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_FLOW_TYPE(x) ((x) << 16) 204 + #define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DEST_PORT(x) ((x) << 18) 205 + #define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DROP_ACTION(x) ((x) << 22) 206 + #define MSCC_MS_SAM_NM_FLOW_CP_KAY_FLOW_TYPE(x) ((x) << 24) 207 + #define MSCC_MS_SAM_NM_FLOW_CP_KAY_DEST_PORT(x) ((x) << 26) 208 + #define MSCC_MS_SAM_NM_FLOW_CP_KAY_DROP_ACTION(x) ((x) << 30) 209 + 210 + /* MACSEC_MISC_CONTROL */ 211 + #define MSCC_MS_MISC_CONTROL_MC_LATENCY_FIX(x) (x) 212 + #define MSCC_MS_MISC_CONTROL_MC_LATENCY_FIX_M GENMASK(5, 0) 213 + #define MSCC_MS_MISC_CONTROL_STATIC_BYPASS BIT(8) 214 + #define MSCC_MS_MISC_CONTROL_NM_MACSEC_EN BIT(9) 215 + #define MSCC_MS_MISC_CONTROL_VALIDATE_FRAMES(x) ((x) << 10) 216 + #define MSCC_MS_MISC_CONTROL_VALIDATE_FRAMES_M GENMASK(11, 10) 217 + #define MSCC_MS_MISC_CONTROL_XFORM_REC_SIZE(x) ((x) << 24) 218 + #define MSCC_MS_MISC_CONTROL_XFORM_REC_SIZE_M GENMASK(25, 24) 219 + 220 + /* MACSEC_COUNT_CONTROL */ 221 + #define MSCC_MS_COUNT_CONTROL_RESET_ALL BIT(0) 222 + #define MSCC_MS_COUNT_CONTROL_DEBUG_ACCESS BIT(1) 223 + #define MSCC_MS_COUNT_CONTROL_SATURATE_CNTRS BIT(2) 224 + #define MSCC_MS_COUNT_CONTROL_AUTO_CNTR_RESET BIT(3) 225 + 226 + /* MACSEC_PARAMS2_IG_CC_CONTROL */ 227 + #define MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_CTRL_ACT BIT(14) 228 + #define MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_ACT BIT(15) 229 + 230 + /* MACSEC_PARAMS2_IG_CP_TAG */ 231 + #define MSCC_MS_PARAMS2_IG_CP_TAG_MAP_TBL(x) (x) 232 + #define MSCC_MS_PARAMS2_IG_CP_TAG_MAP_TBL_M GENMASK(23, 0) 233 + #define MSCC_MS_PARAMS2_IG_CP_TAG_DEF_UP(x) ((x) << 24) 234 + #define MSCC_MS_PARAMS2_IG_CP_TAG_DEF_UP_M GENMASK(26, 24) 235 + #define MSCC_MS_PARAMS2_IG_CP_TAG_STAG_UP_EN BIT(27) 236 + #define MSCC_MS_PARAMS2_IG_CP_TAG_QTAG_UP_EN BIT(28) 237 + #define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QINQ BIT(29) 238 + #define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_STAG BIT(30) 239 + #define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QTAG BIT(31) 240 + 241 + /* MACSEC_VLAN_MTU_CHECK */ 242 + #define MSCC_MS_VLAN_MTU_CHECK_MTU_COMPARE(x) (x) 243 + #define MSCC_MS_VLAN_MTU_CHECK_MTU_COMPARE_M GENMASK(14, 0) 244 + #define MSCC_MS_VLAN_MTU_CHECK_MTU_COMP_DROP BIT(15) 245 + 246 + /* MACSEC_NON_VLAN_MTU_CHECK */ 247 + #define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMPARE(x) (x) 248 + #define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMPARE_M GENMASK(14, 0) 249 + #define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMP_DROP BIT(15) 250 + 251 + /* MACSEC_PP_CTRL */ 252 + #define MSCC_MS_PP_CTRL_MACSEC_OCTET_INCR_MODE BIT(0) 253 + 254 + /* MACSEC_INTR_CTRL_STATUS */ 255 + #define MSCC_MS_INTR_CTRL_STATUS_INTR_CLR_STATUS(x) (x) 256 + #define MSCC_MS_INTR_CTRL_STATUS_INTR_CLR_STATUS_M GENMASK(15, 0) 257 + #define MSCC_MS_INTR_CTRL_STATUS_INTR_ENABLE(x) ((x) << 16) 258 + #define MSCC_MS_INTR_CTRL_STATUS_INTR_ENABLE_M GENMASK(31, 16) 259 + 260 + #endif