can: peak_canfd: rearrange the way resources are released
authorStephane Grosjean <s.grosjean@peak-system.com>
Thu, 21 Jun 2018 13:23:30 +0000 (15:23 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 27 Jul 2018 08:40:18 +0000 (10:40 +0200)
This patch improves the sequence the resources are released by, first,

- disabling the IRQ in the controller, then by
- resetting the DMA logic, and finally, by
- adding a read cycle to ensure that the above commands have been received

before freeing the system interrupt.

Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/peak_canfd/peak_pciefd_main.c

index b09961b1eeef3cb080dae738c012defe998b6d51..c458d5fdc8d3e55ed7ecb9de2772fc51a645edd9 100644 (file)
@@ -488,13 +488,16 @@ static int pciefd_post_cmd(struct peak_canfd_priv *ucan)
 
                /* controller now in reset mode: */
 
+               /* disable IRQ for this CAN */
+               pciefd_can_writereg(priv, CANFD_CTL_IEN_BIT,
+                                   PCIEFD_REG_CAN_RX_CTL_CLR);
+
                /* stop and reset DMA addresses in Tx/Rx engines */
                pciefd_can_clear_tx_dma(priv);
                pciefd_can_clear_rx_dma(priv);
 
-               /* disable IRQ for this CAN */
-               pciefd_can_writereg(priv, CANFD_CTL_IEN_BIT,
-                                   PCIEFD_REG_CAN_RX_CTL_CLR);
+               /* wait for above commands to complete (read cycle) */
+               (void)pciefd_sys_readreg(priv->board, PCIEFD_REG_SYS_VER1);
 
                free_irq(priv->ucan.ndev->irq, priv);