Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Jul 2023 15:59:04 -0700
From:      Kevin Bowling <kevin.bowling@kev009.com>
To:        Kevin Bowling <kbowling@freebsd.org>
Cc:        src-committers@freebsd.org, dev-commits-src-all@freebsd.org,  dev-commits-src-main@freebsd.org
Subject:   Re: git: cbcab907f8ad - main - e1000: Corrections for lem(4)/em(4) txcsum offload
Message-ID:  <CAK7dMtCzy43m_DGhk3xNY_7HdAvcEe4AW6cevstSQ%2Bo3%2BmpOEQ@mail.gmail.com>
In-Reply-To: <202307272258.36RMwPnG052295@gitrepo.freebsd.org>
References:  <202307272258.36RMwPnG052295@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
MFC after: 1 week

On Thu, Jul 27, 2023 at 3:58=E2=80=AFPM Kevin Bowling <kbowling@freebsd.org=
> wrote:
>
> The branch main has been updated by kbowling:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=3Dcbcab907f8ad1a4ac38dbc574c=
747ac2901faa54
>
> commit cbcab907f8ad1a4ac38dbc574c747ac2901faa54
> Author:     Kevin Bowling <kbowling@FreeBSD.org>
> AuthorDate: 2023-07-27 22:50:32 +0000
> Commit:     Kevin Bowling <kbowling@FreeBSD.org>
> CommitDate: 2023-07-27 22:58:05 +0000
>
>     e1000: Corrections for lem(4)/em(4) txcsum offload
>
>     Explicitly set ipcss/ipcse/ipcso for IPv6 per intel SDM as indicated =
in
>     inline comments.
>
>     Fix and consolidate 82543/82547 hwcsum exemption.
>
>     While here rearrange and expand some commentary.
> ---
>  sys/dev/e1000/em_txrx.c | 37 +++++++++++++++++++++++--------------
>  sys/dev/e1000/if_em.c   | 11 ++++-------
>  2 files changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/sys/dev/e1000/em_txrx.c b/sys/dev/e1000/em_txrx.c
> index 8b1d2817490f..0e433f388ac5 100644
> --- a/sys/dev/e1000/em_txrx.c
> +++ b/sys/dev/e1000/em_txrx.c
> @@ -186,7 +186,7 @@ em_tso_setup(struct e1000_softc *sc, if_pkt_info_t pi=
, uint32_t *txd_upper,
>         TXD->tcp_seg_setup.fields.hdr_len =3D hdr_len;
>
>         /*
> -        * 8254x SDM4.0 page 45, and PCIe GbE SDM2.5 page 63
> +        * "PCI/PCI-X SDM 4.0" page 45, and "PCIe GbE SDM 2.5" page 63
>          * - Set up basic TUCMDs
>          * - Enable IP bit on 82544
>          * - For others IP bit on indicates IPv4, while off indicates IPv=
6
> @@ -212,10 +212,6 @@ em_tso_setup(struct e1000_softc *sc, if_pkt_info_t p=
i, uint32_t *txd_upper,
>         return (cur);
>  }
>
> -#define TSO_WORKAROUND 4
> -#define DONT_FORCE_CTX 1
> -
> -
>  /*********************************************************************
>   *  The offload context is protocol specific (TCP/UDP) and thus
>   *  only needs to be set when the protocol changes. The occasion
> @@ -232,6 +228,7 @@ em_tso_setup(struct e1000_softc *sc, if_pkt_info_t pi=
, uint32_t *txd_upper,
>   *  in turn greatly slow down performance to send small sized
>   *  frames.
>   **********************************************************************/
> +#define DONT_FORCE_CTX 1
>
>  static int
>  em_transmit_checksum_setup(struct e1000_softc *sc, if_pkt_info_t pi,
> @@ -271,20 +268,30 @@ em_transmit_checksum_setup(struct e1000_softc *sc, =
if_pkt_info_t pi,
>         }
>
>         TXD =3D (struct e1000_context_desc *)&txr->tx_base[cur];
> +       /*
> +        * ipcss - Start offset for header checksum calculation.
> +        * ipcse - End offset for header checksum calculation.
> +        * ipcso - Offset of place to put the checksum.
> +        *
> +        * We set ipcsX values regardless of IP version to work around HW=
 issues
> +        * and ipcse must be 0 for IPv6 per "PCIe GbE SDM 2.5" page 61.
> +        * IXSM controls whether it's inserted.
> +        */
> +       TXD->lower_setup.ip_fields.ipcss =3D pi->ipi_ehdrlen;
> +       TXD->lower_setup.ip_fields.ipcso =3D pi->ipi_ehdrlen +
> +           offsetof(struct ip, ip_sum);
>         if (csum_flags & CSUM_IP) {
>                 *txd_upper |=3D E1000_TXD_POPTS_IXSM << 8;
> -               /*
> -                * Start offset for header checksum calculation.
> -                * End offset for header checksum calculation.
> -                * Offset of place to put the checksum.
> -                */
> -               TXD->lower_setup.ip_fields.ipcss =3D pi->ipi_ehdrlen;
>                 TXD->lower_setup.ip_fields.ipcse =3D htole16(hdr_len);
> -               TXD->lower_setup.ip_fields.ipcso =3D pi->ipi_ehdrlen +
> -                   offsetof(struct ip, ip_sum);
>                 cmd |=3D E1000_TXD_CMD_IP;
> -       }
> +       } else if (csum_flags & (CSUM_IP6_TCP | CSUM_IP6_UDP))
> +               TXD->lower_setup.ip_fields.ipcse =3D htole16(0);
>
> +       /*
> +        * tucss - Start offset for payload checksum calculation.
> +        * tucse - End offset for payload checksum calculation.
> +        * tucso - Offset of place to put the checksum.
> +        */
>         if (csum_flags & (CSUM_TCP | CSUM_UDP | CSUM_IP6_TCP | CSUM_IP6_U=
DP)) {
>                 uint8_t tucso;
>
> @@ -320,6 +327,8 @@ em_transmit_checksum_setup(struct e1000_softc *sc, if=
_pkt_info_t pi,
>         return (cur);
>  }
>
> +#define TSO_WORKAROUND 4 /* TSO sentinel descriptor */
> +
>  static int
>  em_isc_txd_encap(void *arg, if_pkt_info_t pi)
>  {
> diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
> index 0da1f0a2dc67..32d8c3282e33 100644
> --- a/sys/dev/e1000/if_em.c
> +++ b/sys/dev/e1000/if_em.c
> @@ -948,15 +948,13 @@ em_if_attach_pre(if_ctx_t ctx)
>                 scctx->isc_tx_csum_flags =3D CSUM_TCP | CSUM_UDP | CSUM_I=
P_TSO |
>                     CSUM_IP6_TCP | CSUM_IP6_UDP;
>
> -               /* 8254x SDM4.0 page 33 - FDX requirement on these chips =
*/
> -               if (hw->mac.type =3D=3D e1000_82547 || hw->mac.type =3D=
=3D e1000_82547_rev_2)
> +               /* "PCI/PCI-X SDM 4.0" page 33 (b) - FDX requirement on t=
hese chips */
> +               if (hw->mac.type < e1000_82543 || hw->mac.type =3D=3D e10=
00_82547 ||
> +                   hw->mac.type =3D=3D e1000_82547_rev_2)
>                         scctx->isc_capenable &=3D ~(IFCAP_HWCSUM|IFCAP_VL=
AN_HWCSUM);
> -
> -               if (hw->mac.type < e1000_82543)
> -                       scctx->isc_capabilities &=3D ~(IFCAP_HWCSUM|IFCAP=
_VLAN_HWCSUM);
>                 /* 82541ER doesn't do HW tagging */
>                 if (hw->device_id =3D=3D E1000_DEV_ID_82541ER || hw->devi=
ce_id =3D=3D E1000_DEV_ID_82541ER_LOM)
> -                       scctx->isc_capabilities &=3D ~IFCAP_VLAN_HWTAGGIN=
G;
> +                       scctx->isc_capenable &=3D ~IFCAP_VLAN_HWTAGGING;
>                 /* INTx only */
>                 scctx->isc_msix_bar =3D 0;
>         }
> @@ -1352,7 +1350,6 @@ em_if_init(if_ctx_t ctx)
>                     E1000_RAR_ENTRIES - 1);
>         }
>
> -
>         /* Initialize the hardware */
>         em_reset(ctx);
>         em_if_update_admin_status(ctx);
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAK7dMtCzy43m_DGhk3xNY_7HdAvcEe4AW6cevstSQ%2Bo3%2BmpOEQ>