hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/phy/mscc/mscc_main.c
....@@ -527,14 +527,27 @@
527527 * * 2.0 ns (which causes the data to be sampled at exactly half way between
528528 * clock transitions at 1000 Mbps) if delays should be enabled
529529 */
530
-static int vsc85xx_rgmii_set_skews(struct phy_device *phydev, u32 rgmii_cntl,
531
- u16 rgmii_rx_delay_mask,
532
- u16 rgmii_tx_delay_mask)
530
+static int vsc85xx_update_rgmii_cntl(struct phy_device *phydev, u32 rgmii_cntl,
531
+ u16 rgmii_rx_delay_mask,
532
+ u16 rgmii_tx_delay_mask)
533533 {
534534 u16 rgmii_rx_delay_pos = ffs(rgmii_rx_delay_mask) - 1;
535535 u16 rgmii_tx_delay_pos = ffs(rgmii_tx_delay_mask) - 1;
536536 u16 reg_val = 0;
537
- int rc;
537
+ u16 mask = 0;
538
+ int rc = 0;
539
+
540
+ /* For traffic to pass, the VSC8502 family needs the RX_CLK disable bit
541
+ * to be unset for all PHY modes, so do that as part of the paged
542
+ * register modification.
543
+ * For some family members (like VSC8530/31/40/41) this bit is reserved
544
+ * and read-only, and the RX clock is enabled by default.
545
+ */
546
+ if (rgmii_cntl == VSC8502_RGMII_CNTL)
547
+ mask |= VSC8502_RGMII_RX_CLK_DISABLE;
548
+
549
+ if (phy_interface_is_rgmii(phydev))
550
+ mask |= rgmii_rx_delay_mask | rgmii_tx_delay_mask;
538551
539552 mutex_lock(&phydev->lock);
540553
....@@ -545,10 +558,9 @@
545558 phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
546559 reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_tx_delay_pos;
547560
548
- rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2,
549
- rgmii_cntl,
550
- rgmii_rx_delay_mask | rgmii_tx_delay_mask,
551
- reg_val);
561
+ if (mask)
562
+ rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2,
563
+ rgmii_cntl, mask, reg_val);
552564
553565 mutex_unlock(&phydev->lock);
554566
....@@ -557,19 +569,11 @@
557569
558570 static int vsc85xx_default_config(struct phy_device *phydev)
559571 {
560
- int rc;
561
-
562572 phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
563573
564
- if (phy_interface_mode_is_rgmii(phydev->interface)) {
565
- rc = vsc85xx_rgmii_set_skews(phydev, VSC8502_RGMII_CNTL,
566
- VSC8502_RGMII_RX_DELAY_MASK,
567
- VSC8502_RGMII_TX_DELAY_MASK);
568
- if (rc)
569
- return rc;
570
- }
571
-
572
- return 0;
574
+ return vsc85xx_update_rgmii_cntl(phydev, VSC8502_RGMII_CNTL,
575
+ VSC8502_RGMII_RX_DELAY_MASK,
576
+ VSC8502_RGMII_TX_DELAY_MASK);
573577 }
574578
575579 static int vsc85xx_get_tunable(struct phy_device *phydev,
....@@ -1646,13 +1650,11 @@
16461650 if (ret)
16471651 return ret;
16481652
1649
- if (phy_interface_is_rgmii(phydev)) {
1650
- ret = vsc85xx_rgmii_set_skews(phydev, VSC8572_RGMII_CNTL,
1651
- VSC8572_RGMII_RX_DELAY_MASK,
1652
- VSC8572_RGMII_TX_DELAY_MASK);
1653
- if (ret)
1654
- return ret;
1655
- }
1653
+ ret = vsc85xx_update_rgmii_cntl(phydev, VSC8572_RGMII_CNTL,
1654
+ VSC8572_RGMII_RX_DELAY_MASK,
1655
+ VSC8572_RGMII_TX_DELAY_MASK);
1656
+ if (ret)
1657
+ return ret;
16561658
16571659 ret = genphy_soft_reset(phydev);
16581660 if (ret)
....@@ -2563,6 +2565,7 @@
25632565 module_phy_driver(vsc85xx_driver);
25642566
25652567 static struct mdio_device_id __maybe_unused vsc85xx_tbl[] = {
2568
+ { PHY_ID_VSC8502, 0xfffffff0, },
25662569 { PHY_ID_VSC8504, 0xfffffff0, },
25672570 { PHY_ID_VSC8514, 0xfffffff0, },
25682571 { PHY_ID_VSC8530, 0xfffffff0, },