mirror of
https://github.com/torvalds/linux.git
synced 2026-06-10 15:42:19 +02:00
r8169: fix vlan tag read ordering.
commit ce11ff5e59 upstream.
Control of receive descriptor must not be returned to ethernet chipset
before vlan tag processing is done.
VLAN tag receive word is now reset both in normal and error path.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Spotted-by: Timo Teras <timo.teras@iki.fi>
Cc: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
dab2d3dc45
commit
4ea659de21
|
|
@ -1690,8 +1690,6 @@ static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
|
|||
|
||||
if (opts2 & RxVlanTag)
|
||||
__vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
|
||||
|
||||
desc->opts2 = 0;
|
||||
}
|
||||
|
||||
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
|
|
@ -5434,8 +5432,6 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget
|
|||
!(status & (RxRWT | RxFOVF)) &&
|
||||
(dev->features & NETIF_F_RXALL))
|
||||
goto process_pkt;
|
||||
|
||||
rtl8169_mark_to_asic(desc, rx_buf_sz);
|
||||
} else {
|
||||
struct sk_buff *skb;
|
||||
dma_addr_t addr;
|
||||
|
|
@ -5456,16 +5452,14 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget
|
|||
if (unlikely(rtl8169_fragmented_frame(status))) {
|
||||
dev->stats.rx_dropped++;
|
||||
dev->stats.rx_length_errors++;
|
||||
rtl8169_mark_to_asic(desc, rx_buf_sz);
|
||||
continue;
|
||||
goto release_descriptor;
|
||||
}
|
||||
|
||||
skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],
|
||||
tp, pkt_size, addr);
|
||||
rtl8169_mark_to_asic(desc, rx_buf_sz);
|
||||
if (!skb) {
|
||||
dev->stats.rx_dropped++;
|
||||
continue;
|
||||
goto release_descriptor;
|
||||
}
|
||||
|
||||
rtl8169_rx_csum(skb, status);
|
||||
|
|
@ -5481,6 +5475,10 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget
|
|||
tp->rx_stats.bytes += pkt_size;
|
||||
u64_stats_update_end(&tp->rx_stats.syncp);
|
||||
}
|
||||
release_descriptor:
|
||||
desc->opts2 = 0;
|
||||
wmb();
|
||||
rtl8169_mark_to_asic(desc, rx_buf_sz);
|
||||
}
|
||||
|
||||
count = cur_rx - tp->cur_rx;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user