Another mistake

On Wed, Oct 12, 2022 at 01:45:30PM +0200, Moritz Buhl wrote:
> On Tue, Oct 11, 2022 at 04:16:15PM +0100, Stuart Henderson wrote:
> > On 2022/10/11 15:03, Moritz Buhl wrote:
> > > Here is a new diff for checksum offloading (ipv4, udp, tcp) for em(4).
> > > 
> > > The previous diff didn't implement hardware vlan tagging for >em82578
> > > which should result in variable ethernet header lengths and thus
> > > wrong checksums inserted at wrong places.
> > > 
> > > The diff below addresses this.
> > > I would appreciate further testing reports with different controllers.
> > > 
> > > mbuhl
> > 
> > I tried this on my laptop which has I219-V em (I run it in a trunk
> > with iwm). It breaks tx (packets don't show up on the other side).
> > rx seems ok.
> 
> The following diff will restrict the usage of the advanced 
> descriptors to 82575, 82576, i350 and i210, and fix what the
> last diff broke for i219.
> 
> Index: dev/pci/if_em.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_em.c,v
> retrieving revision 1.362
> diff -u -p -r1.362 if_em.c
> --- dev/pci/if_em.c   23 Jun 2022 09:38:28 -0000      1.362
> +++ dev/pci/if_em.c   11 Oct 2022 16:05:43 -0000
> @@ -37,6 +37,8 @@ POSSIBILITY OF SUCH DAMAGE.
>  #include <dev/pci/if_em.h>
>  #include <dev/pci/if_em_soc.h>
>  
> +#include <netinet/ip6.h>
> +
>  /*********************************************************************
>   *  Driver version
>   *********************************************************************/
> @@ -278,6 +280,8 @@ void em_receive_checksum(struct em_softc
>                        struct mbuf *);
>  u_int        em_transmit_checksum_setup(struct em_queue *, struct mbuf *, 
> u_int,
>           u_int32_t *, u_int32_t *);
> +u_int        em_tx_ctx_setup(struct em_queue *, struct mbuf *, u_int, 
> u_int32_t *,
> +         u_int32_t *);
>  void em_iff(struct em_softc *);
>  void em_update_link_status(struct em_softc *);
>  int  em_get_buf(struct em_queue *, int);
> @@ -1220,10 +1224,9 @@ em_encap(struct em_queue *que, struct mb
>                   BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
>       }
>  
> -     if (sc->hw.mac_type >= em_82543 && sc->hw.mac_type != em_82575 &&
> -         sc->hw.mac_type != em_82576 &&
> -         sc->hw.mac_type != em_82580 && sc->hw.mac_type != em_i210 &&
> -         sc->hw.mac_type != em_i350) {
> +     if (sc->hw.mac_type >= em_82575 && sc->hw.mac_type <= em_i210) {
> +             used += em_tx_ctx_setup(que, m, head, &txd_upper, &txd_lower);
> +     } else if (sc->hw.mac_type >= em_82543) {
>               used += em_transmit_checksum_setup(que, m, head,
>                   &txd_upper, &txd_lower);
>       } else {
> @@ -1278,7 +1281,7 @@ em_encap(struct em_queue *que, struct mb
>  
>  #if NVLAN > 0
>       /* Find out if we are in VLAN mode */
> -     if (m->m_flags & M_VLANTAG) {
> +     if (m->m_flags & M_VLANTAG && sc->hw.mac_type < em_82575) {

I missed this spot, it should be
        if (m->m_flags & M_VLANTAG && (sc->hw.mac_type < em_82575 ||
            sc->hw.mac_type > em_i210)) {


Reply via email to