netif_rx(skb);
 }
 
+static irqreturn_t sja1000_reset_interrupt(int irq, void *dev_id)
+{
+       struct net_device *dev = (struct net_device *)dev_id;
+
+       netdev_dbg(dev, "performing a soft reset upon overrun\n");
+       sja1000_start(dev);
+
+       return IRQ_HANDLED;
+}
+
 static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
 {
        struct sja1000_priv *priv = netdev_priv(dev);
        enum can_state rx_state, tx_state;
        unsigned int rxerr, txerr;
        uint8_t ecc, alc;
+       int ret = 0;
 
        skb = alloc_can_err_skb(dev, &cf);
        if (skb == NULL)
                stats->rx_over_errors++;
                stats->rx_errors++;
                sja1000_write_cmdreg(priv, CMD_CDO);    /* clear bit */
+
+               /* Some controllers needs additional handling upon overrun
+                * condition: the controller may sometimes be totally confused
+                * and refuse any new frame while its buffer is empty. The only
+                * way to re-sync the read vs. write buffer offsets is to
+                * stop any current handling and perform a reset.
+                */
+               if (priv->flags & SJA1000_QUIRK_RESET_ON_OVERRUN)
+                       ret = IRQ_WAKE_THREAD;
        }
 
        if (isrc & IRQ_EI) {
 
        netif_rx(skb);
 
-       return 0;
+       return ret;
 }
 
 irqreturn_t sja1000_interrupt(int irq, void *dev_id)
                if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) {
                        /* error interrupt */
                        err = sja1000_err(dev, isrc, status);
+                       if (err == IRQ_WAKE_THREAD)
+                               ret = err;
                        if (err)
                                break;
                }
 
        /* register interrupt handler, if not done by the device driver */
        if (!(priv->flags & SJA1000_CUSTOM_IRQ_HANDLER)) {
-               err = request_irq(dev->irq, sja1000_interrupt, priv->irq_flags,
-                                 dev->name, (void *)dev);
+               err = request_threaded_irq(dev->irq, sja1000_interrupt,
+                                          sja1000_reset_interrupt,
+                                          priv->irq_flags, dev->name, (void *)dev);
                if (err) {
                        close_candev(dev);
                        return -EAGAIN;
 
 
 static void sp_rzn1_init(struct sja1000_priv *priv, struct device_node *of)
 {
-       priv->flags = SJA1000_QUIRK_NO_CDR_REG;
+       priv->flags = SJA1000_QUIRK_NO_CDR_REG | SJA1000_QUIRK_RESET_ON_OVERRUN;
 }
 
 static void sp_populate(struct sja1000_priv *priv,
                priv->irq_flags = IRQF_SHARED;
        }
 
+       if (priv->flags & SJA1000_QUIRK_RESET_ON_OVERRUN)
+               priv->irq_flags |= IRQF_ONESHOT;
+
        dev->irq = irq;
        priv->reg_base = addr;