@@ -224,7 +224,7 @@ static u8 mlxbf_tmfifo_net_default_mac[ETH_ALEN] = {
224
224
static efi_char16_t mlxbf_tmfifo_efi_name [] = L"RshimMacAddr" ;
225
225
226
226
/* Maximum L2 header length. */
227
- #define MLXBF_TMFIFO_NET_L2_OVERHEAD 36
227
+ #define MLXBF_TMFIFO_NET_L2_OVERHEAD (ETH_HLEN + VLAN_HLEN)
228
228
229
229
/* Supported virtio-net features. */
230
230
#define MLXBF_TMFIFO_NET_FEATURES \
@@ -642,13 +642,14 @@ static void mlxbf_tmfifo_rxtx_word(struct mlxbf_tmfifo_vring *vring,
642
642
* flag is set.
643
643
*/
644
644
static void mlxbf_tmfifo_rxtx_header (struct mlxbf_tmfifo_vring * vring ,
645
- struct vring_desc * desc ,
645
+ struct vring_desc * * desc ,
646
646
bool is_rx , bool * vring_change )
647
647
{
648
648
struct mlxbf_tmfifo * fifo = vring -> fifo ;
649
649
struct virtio_net_config * config ;
650
650
struct mlxbf_tmfifo_msg_hdr hdr ;
651
651
int vdev_id , hdr_len ;
652
+ bool drop_rx = false;
652
653
653
654
/* Read/Write packet header. */
654
655
if (is_rx ) {
@@ -668,8 +669,8 @@ static void mlxbf_tmfifo_rxtx_header(struct mlxbf_tmfifo_vring *vring,
668
669
if (ntohs (hdr .len ) >
669
670
__virtio16_to_cpu (virtio_legacy_is_little_endian (),
670
671
config -> mtu ) +
671
- MLXBF_TMFIFO_NET_L2_OVERHEAD )
672
- return ;
672
+ MLXBF_TMFIFO_NET_L2_OVERHEAD )
673
+ drop_rx = true ;
673
674
} else {
674
675
vdev_id = VIRTIO_ID_CONSOLE ;
675
676
hdr_len = 0 ;
@@ -684,16 +685,25 @@ static void mlxbf_tmfifo_rxtx_header(struct mlxbf_tmfifo_vring *vring,
684
685
685
686
if (!tm_dev2 )
686
687
return ;
687
- vring -> desc = desc ;
688
+ vring -> desc = * desc ;
688
689
vring = & tm_dev2 -> vrings [MLXBF_TMFIFO_VRING_RX ];
689
690
* vring_change = true;
690
691
}
692
+
693
+ if (drop_rx && !IS_VRING_DROP (vring )) {
694
+ if (vring -> desc_head )
695
+ mlxbf_tmfifo_release_pkt (vring );
696
+ * desc = & vring -> drop_desc ;
697
+ vring -> desc_head = * desc ;
698
+ vring -> desc = * desc ;
699
+ }
700
+
691
701
vring -> pkt_len = ntohs (hdr .len ) + hdr_len ;
692
702
} else {
693
703
/* Network virtio has an extra header. */
694
704
hdr_len = (vring -> vdev_id == VIRTIO_ID_NET ) ?
695
705
sizeof (struct virtio_net_hdr ) : 0 ;
696
- vring -> pkt_len = mlxbf_tmfifo_get_pkt_len (vring , desc );
706
+ vring -> pkt_len = mlxbf_tmfifo_get_pkt_len (vring , * desc );
697
707
hdr .type = (vring -> vdev_id == VIRTIO_ID_NET ) ?
698
708
VIRTIO_ID_NET : VIRTIO_ID_CONSOLE ;
699
709
hdr .len = htons (vring -> pkt_len - hdr_len );
@@ -742,7 +752,7 @@ static bool mlxbf_tmfifo_rxtx_one_desc(struct mlxbf_tmfifo_vring *vring,
742
752
743
753
/* Beginning of a packet. Start to Rx/Tx packet header. */
744
754
if (vring -> pkt_len == 0 ) {
745
- mlxbf_tmfifo_rxtx_header (vring , desc , is_rx , & vring_change );
755
+ mlxbf_tmfifo_rxtx_header (vring , & desc , is_rx , & vring_change );
746
756
(* avail )-- ;
747
757
748
758
/* Return if new packet is for another ring. */
0 commit comments