]> git.baikalelectronics.ru Git - kernel.git/commit
net: macb: fix random memory corruption on RX with 64-bit DMA
authorAnssi Hannula <anssi.hannula@bitwise.fi>
Mon, 17 Dec 2018 13:05:39 +0000 (15:05 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Dec 2018 00:17:48 +0000 (16:17 -0800)
commita987ba0cf10aa1a3bb7a63e3d541f2c1b36b4cab
tree5b039de829170da10e00ea5ce26e4b7fdbdfe03d
parent2c87c4c508f68c9b15c46f628b7a12bea315bfb7
net: macb: fix random memory corruption on RX with 64-bit DMA

64-bit DMA addresses are split in upper and lower halves that are
written in separate fields on GEM. For RX, bit 0 of the address is used
as the ownership bit (RX_USED). When the RX_USED bit is unset the
controller is allowed to write data to the buffer.

The driver does not guarantee that the controller already sees the upper
half when the RX_USED bit is cleared, possibly resulting in the
controller writing an incoming frame to an address with an incorrect
upper half and therefore possibly corrupting unrelated system memory.

Fix that by adding the necessary DMA memory barrier between the writes.

This corruption was observed on a ZynqMP based system.

Fixes: 5ad31d520327 ("net: macb: Add 64 bit addressing support for GEM")
Signed-off-by: Anssi Hannula <anssi.hannula@bitwise.fi>
Acked-by: Harini Katakam <harini.katakam@xilinx.com>
Tested-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
Cc: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cadence/macb_main.c