diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2019-07-03 10:50:21 +0200 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2019-07-03 10:50:21 +0200 |
commit | 341924049558e5f7c1a148a2c461a417933d35d9 (patch) | |
tree | 1340b4f2131737ef4be63f18ee74cd73ad12cd3e /drivers/net/can/m_can/m_can.c | |
parent | 516337048fa40496ae5ca9863c367ec991a44d9a (diff) | |
parent | 4a8f81b8c053aad250ee247b219904ada72df9a4 (diff) | |
download | kernel_replicant_linux-341924049558e5f7c1a148a2c461a417933d35d9.tar.gz kernel_replicant_linux-341924049558e5f7c1a148a2c461a417933d35d9.tar.bz2 kernel_replicant_linux-341924049558e5f7c1a148a2c461a417933d35d9.zip |
Merge branch 'timers/vdso' into timers/core
so the hyper-v clocksource update can be applied.
Diffstat (limited to 'drivers/net/can/m_can/m_can.c')
-rw-r--r-- | drivers/net/can/m_can/m_can.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index 9b449400376b..deb274a19ba0 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -822,6 +822,27 @@ static int m_can_poll(struct napi_struct *napi, int quota) if (!irqstatus) goto end; + /* Errata workaround for issue "Needless activation of MRAF irq" + * During frame reception while the MCAN is in Error Passive state + * and the Receive Error Counter has the value MCAN_ECR.REC = 127, + * it may happen that MCAN_IR.MRAF is set although there was no + * Message RAM access failure. + * If MCAN_IR.MRAF is enabled, an interrupt to the Host CPU is generated + * The Message RAM Access Failure interrupt routine needs to check + * whether MCAN_ECR.RP = ’1’ and MCAN_ECR.REC = 127. + * In this case, reset MCAN_IR.MRAF. No further action is required. + */ + if ((priv->version <= 31) && (irqstatus & IR_MRAF) && + (m_can_read(priv, M_CAN_ECR) & ECR_RP)) { + struct can_berr_counter bec; + + __m_can_get_berr_counter(dev, &bec); + if (bec.rxerr == 127) { + m_can_write(priv, M_CAN_IR, IR_MRAF); + irqstatus &= ~IR_MRAF; + } + } + psr = m_can_read(priv, M_CAN_PSR); if (irqstatus & IR_ERR_STATE) work_done += m_can_handle_state_errors(dev, psr); |