arch/arm/armv[7|8]-m: implement dcache clean as barrier in write-through mode
This change fixes the issue when SAMv7 GMAC sometimes does not start packet transmission. The issue is that EMAC_NCR_TSTART is written to EMAC_NCR register while tx descriptor is not delivered to memory. Signed-off-by: Petro Karashchenko <petro.karashchenko@gmail.com>
This commit is contained in:
parent
15f88804ca
commit
f39de6fd1a
@ -838,10 +838,10 @@ void up_clean_dcache(uintptr_t start, uintptr_t end)
|
|||||||
start += ssize;
|
start += ssize;
|
||||||
}
|
}
|
||||||
while (start < end);
|
while (start < end);
|
||||||
|
#endif /* !CONFIG_ARMV7M_DCACHE_WRITETHROUGH */
|
||||||
|
|
||||||
ARM_DSB();
|
ARM_DSB();
|
||||||
ARM_ISB();
|
ARM_ISB();
|
||||||
#endif /* !CONFIG_ARMV7M_DCACHE_WRITETHROUGH */
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ARMV7M_DCACHE */
|
#endif /* CONFIG_ARMV7M_DCACHE */
|
||||||
|
|
||||||
@ -915,10 +915,10 @@ void up_clean_dcache_all(void)
|
|||||||
while (tmpways--);
|
while (tmpways--);
|
||||||
}
|
}
|
||||||
while (sets--);
|
while (sets--);
|
||||||
|
#endif /* !CONFIG_ARMV7M_DCACHE_WRITETHROUGH */
|
||||||
|
|
||||||
ARM_DSB();
|
ARM_DSB();
|
||||||
ARM_ISB();
|
ARM_ISB();
|
||||||
#endif /* !CONFIG_ARMV7M_DCACHE_WRITETHROUGH */
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ARMV7M_DCACHE */
|
#endif /* CONFIG_ARMV7M_DCACHE */
|
||||||
|
|
||||||
|
@ -838,10 +838,10 @@ void up_clean_dcache(uintptr_t start, uintptr_t end)
|
|||||||
start += ssize;
|
start += ssize;
|
||||||
}
|
}
|
||||||
while (start < end);
|
while (start < end);
|
||||||
|
#endif /* !CONFIG_ARMV8M_DCACHE_WRITETHROUGH */
|
||||||
|
|
||||||
ARM_DSB();
|
ARM_DSB();
|
||||||
ARM_ISB();
|
ARM_ISB();
|
||||||
#endif /* !CONFIG_ARMV8M_DCACHE_WRITETHROUGH */
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ARMV8M_DCACHE */
|
#endif /* CONFIG_ARMV8M_DCACHE */
|
||||||
|
|
||||||
@ -915,10 +915,10 @@ void up_clean_dcache_all(void)
|
|||||||
while (tmpways--);
|
while (tmpways--);
|
||||||
}
|
}
|
||||||
while (sets--);
|
while (sets--);
|
||||||
|
#endif /* !CONFIG_ARMV8M_DCACHE_WRITETHROUGH */
|
||||||
|
|
||||||
ARM_DSB();
|
ARM_DSB();
|
||||||
ARM_ISB();
|
ARM_ISB();
|
||||||
#endif /* !CONFIG_ARMV8M_DCACHE_WRITETHROUGH */
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ARMV8M_DCACHE */
|
#endif /* CONFIG_ARMV8M_DCACHE */
|
||||||
|
|
||||||
|
@ -1407,13 +1407,6 @@ static int sam_transmit(struct sam_emac_s *priv, int qid)
|
|||||||
regval |= EMAC_NCR_TSTART;
|
regval |= EMAC_NCR_TSTART;
|
||||||
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval);
|
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval);
|
||||||
|
|
||||||
/* REVISIT: Sometimes TSTART is missed? In this case, the symptom is
|
|
||||||
* that the packet is not sent until the next transfer when TXSTART
|
|
||||||
* is set again.
|
|
||||||
*/
|
|
||||||
|
|
||||||
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval);
|
|
||||||
|
|
||||||
/* Setup the TX timeout watchdog (perhaps restarting the timer) */
|
/* Setup the TX timeout watchdog (perhaps restarting the timer) */
|
||||||
|
|
||||||
wd_start(&priv->txtimeout, SAM_TXTIMEOUT,
|
wd_start(&priv->txtimeout, SAM_TXTIMEOUT,
|
||||||
|
Loading…
Reference in New Issue
Block a user