OSDN Git Service

net: ethernet: ti: am65-cpsw: retain PORT_VLAN_REG after suspend/resume
authorRoger Quadros <rogerq@kernel.org>
Fri, 4 Nov 2022 13:23:09 +0000 (15:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Nov 2022 12:20:03 +0000 (12:20 +0000)
During suspend resume the context of PORT_VLAN_REG is lost so
save it during suspend and restore it during resume for
host port and slave ports.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/am65-cpsw-nuss.c
drivers/net/ethernet/ti/am65-cpsw-nuss.h

index 5a842d9..beff21d 100644 (file)
@@ -2877,7 +2877,9 @@ static int am65_cpsw_nuss_suspend(struct device *dev)
        struct am65_cpsw_port *port;
        struct net_device *ndev;
        int i, ret;
+       struct am65_cpsw_host *host_p = am65_common_get_host(common);
 
+       host_p->vid_context = readl(host_p->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET);
        for (i = 0; i < common->port_num; i++) {
                port = &common->ports[i];
                ndev = port->ndev;
@@ -2885,6 +2887,7 @@ static int am65_cpsw_nuss_suspend(struct device *dev)
                if (!ndev)
                        continue;
 
+               port->vid_context = readl(port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET);
                netif_device_detach(ndev);
                if (netif_running(ndev)) {
                        rtnl_lock();
@@ -2908,6 +2911,7 @@ static int am65_cpsw_nuss_resume(struct device *dev)
        struct am65_cpsw_port *port;
        struct net_device *ndev;
        int i, ret;
+       struct am65_cpsw_host *host_p = am65_common_get_host(common);
 
        am65_cpts_resume(common->cpts);
 
@@ -2929,8 +2933,11 @@ static int am65_cpsw_nuss_resume(struct device *dev)
                }
 
                netif_device_attach(ndev);
+               writel(port->vid_context, port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET);
        }
 
+       writel(host_p->vid_context, host_p->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET);
+
        return 0;
 }
 #endif /* CONFIG_PM_SLEEP */
index 2c9850f..e95cc37 100644 (file)
@@ -55,12 +55,16 @@ struct am65_cpsw_port {
        bool                            rx_ts_enabled;
        struct am65_cpsw_qos            qos;
        struct devlink_port             devlink_port;
+       /* Only for suspend resume context */
+       u32                             vid_context;
 };
 
 struct am65_cpsw_host {
        struct am65_cpsw_common         *common;
        void __iomem                    *port_base;
        void __iomem                    *stat_base;
+       /* Only for suspend resume context */
+       u32                             vid_context;
 };
 
 struct am65_cpsw_tx_chn {