Thread (32 messages) flat view 32 messages, 9 authors, 2025-05-22

Re: [net-next PATCH v4 09/11] net: macb: Move most of mac_config to mac_prepare

From: Karumanchi, Vineeth <hidden>
Date: 2025-05-15 06:14:32
Also in: lkml

Hi Sean,

On 5/13/2025 9:19 PM, Sean Anderson wrote:
On 5/13/25 11:29, Karumanchi, Vineeth wrote:
quoted
Hi Sean,
<..>
quoted
quoted
+    spin_lock_irqsave(&bp->lock, flags);
+    old = new = gem_readl(bp, NCFGR);
+    new |= GEM_BIT(SGMIIEN);
This bit represents the AN feature, can we make it conditional to facilitate IP's with AN disabled.
To clarify, this bit enables SGMII timings for AN (as opposed to
1000Base-X). If you don't have AN enabled at 1G, then this bit affects
nothing.

1000Base-X is not currently supported by the built-in PCS. Therefore,
this bit should be set unconditionally at 1G speeds. This patch aims to
avoid functional changes so I have not made it conditional. Making this
bit conditional would be appropriate for a patch adding support for
1000Base-X using the internal PCS.
Yes, agreed.
quoted
quoted
+    if (old != new) {
+        changed = true;
+        gem_writel(bp, NCFGR, new);
+    }
<..>
quoted
     static void macb_usx_pcs_get_state(struct phylink_pcs *pcs,
@@ -589,45 +661,60 @@ static int macb_usx_pcs_config(struct phylink_pcs *pcs,
                      bool permit_pause_to_mac)
   {
       struct macb *bp = container_of(pcs, struct macb, phylink_usx_pcs);
+    unsigned long flags;
+    bool changed;
+    u16 old, new;
   -    gem_writel(bp, USX_CONTROL, gem_readl(bp, USX_CONTROL) |
-           GEM_BIT(SIGNAL_OK));
+    spin_lock_irqsave(&bp->lock, flags);
+    if (macb_pcs_config_an(bp, neg_mode, interface, advertising))
+        changed = true;
   -    return 0;
-}
+    old = new = gem_readl(bp, USX_CONTROL);
+    new |= GEM_BIT(SIGNAL_OK);
+    if (old != new) {
+        changed = true;
+        gem_writel(bp, USX_CONTROL, new);
+    }
   -static void macb_pcs_get_state(struct phylink_pcs *pcs, unsigned int neg_mode,
-                   struct phylink_link_state *state)
-{
-    state->link = 0;
-}
+    old = new = gem_readl(bp, USX_CONTROL);
+    new = GEM_BFINS(SERDES_RATE, MACB_SERDES_RATE_10G, new);
+    new = GEM_BFINS(USX_CTRL_SPEED, HS_SPEED_10000M, new);
+    new &= ~(GEM_BIT(TX_SCR_BYPASS) | GEM_BIT(RX_SCR_BYPASS));
+    new |= GEM_BIT(TX_EN);
+    if (old != new) {
+        changed = true;
+        gem_writel(bp, USX_CONTROL, new);
+    }
The above speed/rate configuration was moved from macb_usx_pcs_link_up() where speed is an argument, which can be leveraged to configure multiple speeds.

Can we achieve configuring for multiple speeds from macb_usx_pcs_config() in fixed-link and phy-mode ?
Form what I can tell, the USX PCS is only used for 10G interfaces. If
you want to add support for using it at other link speeds, then yes some
of these register writes should be moved to link_up. For the moment it
doesn't matter where they happen.

--Sean
Ok, in the latest cadence IP, all speed configurations are mapped to USX 
registers for both internal PCS's (1000Base-X & 10GBase-R).

-- 
🙏 vineeth
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help