mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 03:58:02 +07:00
net: hns3: Updates RX packet info fetch in case of multi BD
In the latest revision of the hardware, if a packet is spanning across multiple BDs then only VLD bit and current data size info is valid in each BD, and rest of the information is only valid in the last BD of the packet. In such case we should make sure we are fetching RX packet size from the first descriptor and information like VLAN should be fetched from last BD. Signed-off-by: Peng Li <lipeng321@huawei.com> Reviewed-by: Yisen Zhuang <yisen.zhuang@huawei.com> Signed-off-by: Salil Mehta <salil.mehta@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e9be0e993d
commit
846fcc8363
@ -2085,9 +2085,8 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
|
||||
|
||||
prefetch(desc);
|
||||
|
||||
length = le16_to_cpu(desc->rx.pkt_len);
|
||||
length = le16_to_cpu(desc->rx.size);
|
||||
bd_base_info = le32_to_cpu(desc->rx.bd_base_info);
|
||||
l234info = le32_to_cpu(desc->rx.l234_info);
|
||||
|
||||
/* Check valid BD */
|
||||
if (!hnae_get_bit(bd_base_info, HNS3_RXD_VLD_B))
|
||||
@ -2121,22 +2120,6 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
|
||||
|
||||
prefetchw(skb->data);
|
||||
|
||||
/* Based on hw strategy, the tag offloaded will be stored at
|
||||
* ot_vlan_tag in two layer tag case, and stored at vlan_tag
|
||||
* in one layer tag case.
|
||||
*/
|
||||
if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
|
||||
u16 vlan_tag;
|
||||
|
||||
vlan_tag = le16_to_cpu(desc->rx.ot_vlan_tag);
|
||||
if (!(vlan_tag & VLAN_VID_MASK))
|
||||
vlan_tag = le16_to_cpu(desc->rx.vlan_tag);
|
||||
if (vlan_tag & VLAN_VID_MASK)
|
||||
__vlan_hwaccel_put_tag(skb,
|
||||
htons(ETH_P_8021Q),
|
||||
vlan_tag);
|
||||
}
|
||||
|
||||
bnum = 1;
|
||||
if (length <= HNS3_RX_HEAD_SIZE) {
|
||||
memcpy(__skb_put(skb, length), va, ALIGN(length, sizeof(long)));
|
||||
@ -2172,6 +2155,23 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
|
||||
}
|
||||
|
||||
*out_bnum = bnum;
|
||||
/* Based on hw strategy, the tag offloaded will be stored at
|
||||
* ot_vlan_tag in two layer tag case, and stored at vlan_tag
|
||||
* in one layer tag case.
|
||||
*/
|
||||
if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
|
||||
u16 vlan_tag;
|
||||
|
||||
vlan_tag = le16_to_cpu(desc->rx.ot_vlan_tag);
|
||||
if (!(vlan_tag & VLAN_VID_MASK))
|
||||
vlan_tag = le16_to_cpu(desc->rx.vlan_tag);
|
||||
if (vlan_tag & VLAN_VID_MASK)
|
||||
__vlan_hwaccel_put_tag(skb,
|
||||
htons(ETH_P_8021Q),
|
||||
vlan_tag);
|
||||
}
|
||||
|
||||
l234info = le32_to_cpu(desc->rx.l234_info);
|
||||
|
||||
if (unlikely(!hnae_get_bit(bd_base_info, HNS3_RXD_VLD_B))) {
|
||||
netdev_err(netdev, "no valid bd,%016llx,%016llx\n",
|
||||
|
Loading…
Reference in New Issue
Block a user