vmxnet3: use ext1 field to indicate encapsulated packet
authorRonak Doshi <doshir@vmware.com>
Wed, 8 Jun 2022 03:23:52 +0000 (20:23 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 9 Jun 2022 10:42:01 +0000 (12:42 +0200)
Till vmxnet3 version 6, om field of transmit descriptor was used
to indicate encapsulated offload packet and msscof was used to
indirectly indicate TSO/CSO. From version 7 and later, ext1 field
will be used to indicate whether packet is encapsulated or not and
om fields will continue to indicate if the packet is TSO or CSO.

Signed-off-by: Ronak Doshi <doshir@vmware.com>
Acked-by: Guolin Yang <gyang@vmware.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/vmxnet3/vmxnet3_defs.h
drivers/net/vmxnet3/vmxnet3_drv.c

index cb9dc72..41d6767 100644 (file)
@@ -148,17 +148,17 @@ struct Vmxnet3_TxDesc {
 
 #ifdef __BIG_ENDIAN_BITFIELD
        u32 msscof:14;  /* MSS, checksum offset, flags */
-       u32 ext1:1;
+       u32 ext1:1;     /* set to 1 to indicate inner csum/tso, vmxnet3 v7 */
        u32 dtype:1;    /* descriptor type */
-       u32 oco:1;
+       u32 oco:1;      /* Outer csum offload */
        u32 gen:1;      /* generation bit */
        u32 len:14;
 #else
        u32 len:14;
        u32 gen:1;      /* generation bit */
-       u32 oco:1;
+       u32 oco:1;      /* Outer csum offload */
        u32 dtype:1;    /* descriptor type */
-       u32 ext1:1;
+       u32 ext1:1;     /* set to 1 to indicate inner csum/tso, vmxnet3 v7 */
        u32 msscof:14;  /* MSS, checksum offset, flags */
 #endif  /* __BIG_ENDIAN_BITFIELD */
 
@@ -262,11 +262,13 @@ struct Vmxnet3_RxCompDesc {
        u32             rqID:10;      /* rx queue/ring ID */
        u32             sop:1;        /* Start of Packet */
        u32             eop:1;        /* End of Packet */
-       u32             ext1:2;
+       u32             ext1:2;       /* bit 0: indicating v4/v6/.. is for inner header */
+                                     /* bit 1: indicating rssType is based on inner header */
        u32             rxdIdx:12;    /* Index of the RxDesc */
 #else
        u32             rxdIdx:12;    /* Index of the RxDesc */
-       u32             ext1:2;
+       u32             ext1:2;       /* bit 0: indicating v4/v6/.. is for inner header */
+                                     /* bit 1: indicating rssType is based on inner header */
        u32             eop:1;        /* End of Packet */
        u32             sop:1;        /* Start of Packet */
        u32             rqID:10;      /* rx queue/ring ID */
index 2ee3a2e..5c42b4a 100644 (file)
@@ -1161,7 +1161,12 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
        if (ctx.mss) {
                if (VMXNET3_VERSION_GE_4(adapter) && skb->encapsulation) {
                        gdesc->txd.hlen = ctx.l4_offset + ctx.l4_hdr_size;
-                       gdesc->txd.om = VMXNET3_OM_ENCAP;
+                       if (VMXNET3_VERSION_GE_7(adapter)) {
+                               gdesc->txd.om = VMXNET3_OM_TSO;
+                               gdesc->txd.ext1 = 1;
+                       } else {
+                               gdesc->txd.om = VMXNET3_OM_ENCAP;
+                       }
                        gdesc->txd.msscof = ctx.mss;
 
                        if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL_CSUM)
@@ -1178,8 +1183,15 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
                            skb->encapsulation) {
                                gdesc->txd.hlen = ctx.l4_offset +
                                                  ctx.l4_hdr_size;
-                               gdesc->txd.om = VMXNET3_OM_ENCAP;
-                               gdesc->txd.msscof = 0;          /* Reserved */
+                               if (VMXNET3_VERSION_GE_7(adapter)) {
+                                       gdesc->txd.om = VMXNET3_OM_CSUM;
+                                       gdesc->txd.msscof = ctx.l4_offset +
+                                                           skb->csum_offset;
+                                       gdesc->txd.ext1 = 1;
+                               } else {
+                                       gdesc->txd.om = VMXNET3_OM_ENCAP;
+                                       gdesc->txd.msscof = 0;          /* Reserved */
+                               }
                        } else {
                                gdesc->txd.hlen = ctx.l4_offset;
                                gdesc->txd.om = VMXNET3_OM_CSUM;