diff options
author | yongari <yongari@FreeBSD.org> | 2010-04-19 22:10:40 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2010-04-19 22:10:40 +0000 |
commit | 66db61c8c0e978eac926b1b47c6c81a108bdaa98 (patch) | |
tree | 4e38df74b4ad94becb3a95f35a704d97f0681706 /sys/dev/age | |
parent | 35d5bf4c1d2ab71a150954bf3464549e9e2c9efc (diff) | |
download | FreeBSD-src-66db61c8c0e978eac926b1b47c6c81a108bdaa98.zip FreeBSD-src-66db61c8c0e978eac926b1b47c6c81a108bdaa98.tar.gz |
With r206844, CSUM_TCP is also set for CSUM_TSO case. Modify
drivers to take into account for the change. Basically CSUM_TSO
should be checked before checking CSUM_TCP.
Diffstat (limited to 'sys/dev/age')
-rw-r--r-- | sys/dev/age/if_age.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/sys/dev/age/if_age.c b/sys/dev/age/if_age.c index 3c5a107..15ce0ef 100644 --- a/sys/dev/age/if_age.c +++ b/sys/dev/age/if_age.c @@ -1629,22 +1629,8 @@ age_encap(struct age_softc *sc, struct mbuf **m_head) } m = *m_head; - /* Configure Tx IP/TCP/UDP checksum offload. */ - if ((m->m_pkthdr.csum_flags & AGE_CSUM_FEATURES) != 0) { - cflags |= AGE_TD_CSUM; - if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0) - cflags |= AGE_TD_TCPCSUM; - if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) - cflags |= AGE_TD_UDPCSUM; - /* Set checksum start offset. */ - cflags |= (poff << AGE_TD_CSUM_PLOADOFFSET_SHIFT); - /* Set checksum insertion position of TCP/UDP. */ - cflags |= ((poff + m->m_pkthdr.csum_data) << - AGE_TD_CSUM_XSUMOFFSET_SHIFT); - } - - /* Configure TSO. */ if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { + /* Configure TSO. */ if (poff + (tcp->th_off << 2) == m->m_pkthdr.len) { /* Not TSO but IP/TCP checksum offload. */ cflags |= AGE_TD_IPCSUM | AGE_TD_TCPCSUM; @@ -1660,6 +1646,18 @@ age_encap(struct age_softc *sc, struct mbuf **m_head) /* Set IP/TCP header size. */ cflags |= ip->ip_hl << AGE_TD_IPHDR_LEN_SHIFT; cflags |= tcp->th_off << AGE_TD_TSO_TCPHDR_LEN_SHIFT; + } else if ((m->m_pkthdr.csum_flags & AGE_CSUM_FEATURES) != 0) { + /* Configure Tx IP/TCP/UDP checksum offload. */ + cflags |= AGE_TD_CSUM; + if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0) + cflags |= AGE_TD_TCPCSUM; + if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) + cflags |= AGE_TD_UDPCSUM; + /* Set checksum start offset. */ + cflags |= (poff << AGE_TD_CSUM_PLOADOFFSET_SHIFT); + /* Set checksum insertion position of TCP/UDP. */ + cflags |= ((poff + m->m_pkthdr.csum_data) << + AGE_TD_CSUM_XSUMOFFSET_SHIFT); } /* Configure VLAN hardware tag insertion. */ |