| From foo@baz Sun May 27 17:33:38 CEST 2018 |
| From: Niklas Cassel <niklas.cassel@axis.com> |
| Date: Mon, 26 Feb 2018 22:47:08 +0100 |
| Subject: net: stmmac: ensure that the device has released ownership before reading data |
| |
| From: Niklas Cassel <niklas.cassel@axis.com> |
| |
| [ Upstream commit a6b25da5e7ba212af5826a662e6a035a79bffabd ] |
| |
| According to Documentation/memory-barriers.txt, we need to use a |
| dma_rmb() after reading the status/own bit, to ensure that all |
| descriptor fields are read after reading the own bit. |
| |
| This way, we ensure that the DMA engine is done with the DMA |
| descriptor before we read the other descriptor fields, e.g. reading |
| the tx hardware timestamp (if PTP is enabled). |
| |
| Signed-off-by: Niklas Cassel <niklas.cassel@axis.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
| @@ -1343,6 +1343,11 @@ static void stmmac_tx_clean(struct stmma |
| if (unlikely(status & tx_dma_own)) |
| break; |
| |
| + /* Make sure descriptor fields are read after reading |
| + * the own bit. |
| + */ |
| + dma_rmb(); |
| + |
| /* Just consider the last segment and ...*/ |
| if (likely(!(status & tx_not_ls))) { |
| /* ... verify the status error condition */ |