Thread (18 messages) 18 messages, 3 authors, 4d ago

RE: [PATCH net-next v1 4/6] r8169: add support for RTL8116af

From: Javen <hidden>
Date: 2026-06-08 06:32:57
Also in: lkml

quoted
+static bool rtl_is_8116af(struct rtl8169_private *tp) {
+     return tp->mac_version == RTL_GIGA_MAC_VER_52 &&
+             (r8168_mac_ocp_read(tp, 0xdc00) & 0x0078) == 0x0030 &&
+             (r8168_mac_ocp_read(tp, 0xd006) & 0x00ff) == 0x0000;
Do we know what these magic numbers mean?
0xdc00 is a package-detect field. 0xd006 is internal HW id. RTL8116AF shares the same RTL_GIGA_MAC_VER_52 mac_version with other variants. 
quoted
 static enum rtl_dash_type rtl_get_dash_type(struct rtl8169_private
*tp)  {
      switch (tp->mac_version) {
@@ -2397,7 +2431,7 @@ static int rtl8169_set_link_ksettings(struct
net_device *ndev,
quoted
      int duplex = cmd->base.duplex;
      int speed = cmd->base.speed;

-     if (!tp->sfp_mode)
+     if (tp->sfp_mode != RTL_SFP_8127_ATF)
              return phylink_ethtool_ksettings_set(tp->phylink, cmd);
Is this even needed? phylink should be able to handle sfp and copper in the
same way.
I will try to handle this.
quoted
@@ -2509,9 +2543,10 @@ void r8169_apply_firmware(struct
rtl8169_private *tp)
quoted
              tp->ocp_base = OCP_STD_PHY_BASE;

              /* PHY soft reset may still be in progress */
-             phy_read_poll_timeout(tp->phydev, MII_BMCR, val,
-                                   !(val & BMCR_RESET),
-                                   50000, 600000, true);
+             if (tp->phydev)
+                     phy_read_poll_timeout(tp->phydev, MII_BMCR, val,
+                                           !(val & BMCR_RESET),
+                                           50000, 600000, true);
Maybe this all needs to move into the PHY driver?
This is after firmware application. And PHY_MDIO_CHG opcode switches the access callbacks between PHY and MAC accessors.
data == 0: phy_read/phy_write
data != 0: mac_mcu_read/mac_mcu_write
So the firmware may contain mixed PHY and MAC.
quoted
-     rg_saw_cnt = phy_read_paged(tp->phydev, 0x0c42, 0x13) & 0x3fff;
-     if (rg_saw_cnt > 0) {
-             u16 sw_cnt_1ms_ini;
+     if (tp->phydev) {
+             rg_saw_cnt = phy_read_paged(tp->phydev, 0x0c42, 0x13) & 0x3fff;
+             if (rg_saw_cnt > 0) {
+                     u16 sw_cnt_1ms_ini;

-             sw_cnt_1ms_ini = (16000000 / rg_saw_cnt) & 0x0fff;
-             r8168_mac_ocp_modify(tp, 0xd412, 0x0fff, sw_cnt_1ms_ini);
+                     sw_cnt_1ms_ini = (16000000 / rg_saw_cnt) & 0x0fff;
+                     r8168_mac_ocp_modify(tp, 0xd412, 0x0fff, sw_cnt_1ms_ini);
+             }
Can this move into the PHY driver?
It reads a counter from PHY, but the calculated value is programmed into MAC OCP register via r8168_mac_ocp_modify, which accesses r8169 through tp->mmio_addr. So I think this can not be moved.
quoted
@@ -5017,9 +5054,11 @@ static void rtl8169_up(struct rtl8169_private *tp)
              rtl8168_driver_start(tp);

      pci_set_master(tp->pci_dev);
-     phy_init_hw(tp->phydev);
-     phy_resume(tp->phydev);
-     rtl8169_init_phy(tp);
+     if (tp->phydev) {
+             phy_init_hw(tp->phydev);
+             phy_resume(tp->phydev);
+             rtl8169_init_phy(tp);
+     }
Why is this needed?
I will try to remove this.

Thanks for your review.

BRs,
Javen
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help