summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDong Aisheng <b29396@freescale.com>2012-08-03 22:33:08 +0800
committerStefan Agner <stefan.agner@toradex.com>2014-06-17 09:27:22 +0200
commit6dc41206d908df9de14c72d23f7fa90c4a472450 (patch)
treecb334c776804f15c1c4453896a76d7df87ceae0e
parent475c9a1a1db659948185a2bd1d434f1419a02235 (diff)
ENGR00217318-3 flexcan: only enter stop mode when device is up
The flexcan is still in disable mode during suspend if it's still not up. We do not need to enter stop mode if find the device is not up since the stop mode does not work well in disable mode(remote wakeup does not work). Using disable mode for suspend if it's not up. Signed-off-by: Dong Aisheng <b29396@freescale.com>
-rw-r--r--drivers/net/can/flexcan.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 1d1c224c8854..920b8a01f9cb 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -1091,15 +1091,16 @@ static int flexcan_suspend(struct platform_device *pdev, pm_message_t state)
if (netif_running(dev)) {
netif_stop_queue(dev);
netif_device_detach(dev);
- }
- priv->can.state = CAN_STATE_SLEEPING;
+ /* enter stop mode if device is up */
+ flexcan_enter_stop(priv);
- flexcan_enter_stop(priv);
+ ret = irq_set_irq_wake(dev->irq, 1);
+ if (ret)
+ return ret;
+ }
- ret = irq_set_irq_wake(dev->irq, 1);
- if (ret)
- return ret;
+ priv->can.state = CAN_STATE_SLEEPING;
return 0;
}
@@ -1110,15 +1111,15 @@ static int flexcan_resume(struct platform_device *pdev)
struct flexcan_priv *priv = netdev_priv(dev);
int ret;
- ret = irq_set_irq_wake(dev->irq, 0);
- if (ret)
- return ret;
-
- flexcan_exit_stop(priv);
-
priv->can.state = CAN_STATE_ERROR_ACTIVE;
if (netif_running(dev)) {
+ ret = irq_set_irq_wake(dev->irq, 0);
+ if (ret)
+ return ret;
+
+ flexcan_exit_stop(priv);
+
netif_device_attach(dev);
netif_start_queue(dev);
}