mirror of https://gitee.com/openkylin/linux.git
net: stmmac: fix dropping of multi-descriptor RX frames
Packets without the last descriptor set should be dropped early. If we receive a frame larger than the DMA buffer, the HW will continue using the next descriptor. Driver mistakes these as individual frames, and sometimes a truncated frame (without the LD set) may look like a valid packet. This fixes a strange issue where the system replies to 4098-byte ping although the MTU/DMA buffer size is set to 4096, and yet at the same time it's logging an oversized packet. Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1b746ce8b3
commit
8ac0c24fe1
|
@ -201,6 +201,11 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x,
|
||||||
if (unlikely(rdes0 & RDES0_OWN))
|
if (unlikely(rdes0 & RDES0_OWN))
|
||||||
return dma_own;
|
return dma_own;
|
||||||
|
|
||||||
|
if (unlikely(!(rdes0 & RDES0_LAST_DESCRIPTOR))) {
|
||||||
|
stats->rx_length_errors++;
|
||||||
|
return discard_frame;
|
||||||
|
}
|
||||||
|
|
||||||
if (unlikely(rdes0 & RDES0_ERROR_SUMMARY)) {
|
if (unlikely(rdes0 & RDES0_ERROR_SUMMARY)) {
|
||||||
if (unlikely(rdes0 & RDES0_DESCRIPTOR_ERROR)) {
|
if (unlikely(rdes0 & RDES0_DESCRIPTOR_ERROR)) {
|
||||||
x->rx_desc++;
|
x->rx_desc++;
|
||||||
|
|
Loading…
Reference in New Issue