net: prestera: cache port state for non-phylink ports too
authorMaksym Glubokiy <maksym.glubokiy@plvision.eu>
Thu, 18 Aug 2022 11:18:21 +0000 (14:18 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 Aug 2022 13:56:45 +0000 (14:56 +0100)
Port event data must stored to port-state cache regardless of whether
the port uses phylink or not since this data is used by ethtool.

Fixes: 52323ef75414 ("net: marvell: prestera: add phylink support")
Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
Signed-off-by: Maksym Glubokiy <maksym.glubokiy@plvision.eu>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/prestera/prestera_main.c

index ede3e53b97901a16c6c347036920058a27abda6b..3489b80ae0d6836dfc6a71260bade0c6851911fb 100644 (file)
@@ -797,32 +797,30 @@ static void prestera_port_handle_event(struct prestera_switch *sw,
 
                caching_dw = &port->cached_hw_stats.caching_dw;
 
-               if (port->phy_link) {
-                       memset(&smac, 0, sizeof(smac));
-                       smac.valid = true;
-                       smac.oper = pevt->data.mac.oper;
-                       if (smac.oper) {
-                               smac.mode = pevt->data.mac.mode;
-                               smac.speed = pevt->data.mac.speed;
-                               smac.duplex = pevt->data.mac.duplex;
-                               smac.fc = pevt->data.mac.fc;
-                               smac.fec = pevt->data.mac.fec;
-                               phylink_mac_change(port->phy_link, true);
-                       } else {
-                               phylink_mac_change(port->phy_link, false);
-                       }
-                       prestera_port_mac_state_cache_write(port, &smac);
+               memset(&smac, 0, sizeof(smac));
+               smac.valid = true;
+               smac.oper = pevt->data.mac.oper;
+               if (smac.oper) {
+                       smac.mode = pevt->data.mac.mode;
+                       smac.speed = pevt->data.mac.speed;
+                       smac.duplex = pevt->data.mac.duplex;
+                       smac.fc = pevt->data.mac.fc;
+                       smac.fec = pevt->data.mac.fec;
                }
+               prestera_port_mac_state_cache_write(port, &smac);
 
                if (port->state_mac.oper) {
-                       if (!port->phy_link)
+                       if (port->phy_link)
+                               phylink_mac_change(port->phy_link, true);
+                       else
                                netif_carrier_on(port->dev);
 
                        if (!delayed_work_pending(caching_dw))
                                queue_delayed_work(prestera_wq, caching_dw, 0);
-               } else if (netif_running(port->dev) &&
-                          netif_carrier_ok(port->dev)) {
-                       if (!port->phy_link)
+               } else {
+                       if (port->phy_link)
+                               phylink_mac_change(port->phy_link, false);
+                       else if (netif_running(port->dev) && netif_carrier_ok(port->dev))
                                netif_carrier_off(port->dev);
 
                        if (delayed_work_pending(caching_dw))