fa.openbsd.tech
[Top] [All Lists]

another re(4) diff for testing.

Subject: another re(4) diff for testing.
From: Brad <brad@xxxxxxxxxxxx>
Date: Thu, 17 Jul 2008 14:32:37 UTC
Newsgroups: fa.openbsd.tech

If you have any of the newer PCIe re(4) chipsets in your system
(especially the 8168C since that is all we have seen so far)
please test the following diff which adds support for TX/RX
checksum offload.


Index: re.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/re.c,v
retrieving revision 1.84
diff -u -p -r1.84 re.c
--- re.c        15 Jul 2008 13:21:17 -0000      1.84
+++ re.c        17 Jul 2008 13:36:04 -0000
@@ -1053,11 +1053,8 @@ re_attach(struct rl_softc *sc, const cha
        IFQ_SET_MAXLEN(&ifp->if_snd, RL_TX_QLEN);
        IFQ_SET_READY(&ifp->if_snd);
 
-       
-       ifp->if_capabilities = IFCAP_VLAN_MTU;
-       if ((sc->rl_flags & RL_FLAG_DESCV2) == 0)
-               ifp->if_capabilities |= IFCAP_CSUM_IPv4 |
-                   IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
+       ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_CSUM_IPv4 |
+                              IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
 
 #if NVLAN > 0
        ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
@@ -1278,7 +1275,7 @@ re_rxeof(struct rl_softc *sc)
        int             i, total_len;
        struct rl_desc  *cur_rx;
        struct rl_rxsoft *rxs;
-       u_int32_t       rxstat;
+       u_int32_t       rxstat, rxvlan;
 
        ifp = &sc->sc_arpcom.ac_if;
 
@@ -1287,6 +1284,7 @@ re_rxeof(struct rl_softc *sc)
                RL_RXDESCSYNC(sc, i,
                    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                rxstat = letoh32(cur_rx->rl_cmdstat);
+               rxvlan = letoh32(cur_rx->rl_vlanctl);
                RL_RXDESCSYNC(sc, i, BUS_DMASYNC_PREREAD);
                if ((rxstat & RL_RDESC_STAT_OWN) != 0)
                        break;
@@ -1399,7 +1397,19 @@ re_rxeof(struct rl_softc *sc)
                /* Do RX checksumming */
 
                if (sc->rl_flags & RL_FLAG_DESCV2) {
-                       /* XXX V2 CSUM */
+                       /* Check IP header checksum */
+                       if ((rxstat & RL_RDESC_STAT_PROTOID) &&
+                           !(rxstat & RL_RDESC_STAT_IPSUMBAD) &&
+                           (rxvlan & RL_RDESC_IPV4))
+                               m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
+
+                       /* Check TCP/UDP checksum */
+                       if (((rxstat & RL_RDESC_STAT_TCP) &&
+                           !(rxstat & RL_RDESC_STAT_TCPSUMBAD)) ||
+                           ((rxstat & RL_RDESC_STAT_UDP) &&
+                           !(rxstat & RL_RDESC_STAT_UDPSUMBAD)))
+                               m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK |
+                                   M_UDP_CSUM_IN_OK;
                } else {
                        /* Check IP header checksum */
                        if ((rxstat & RL_RDESC_STAT_PROTOID) &&
@@ -1614,11 +1624,19 @@ re_encap(struct rl_softc *sc, struct mbu
 
        if ((m->m_pkthdr.csum_flags &
            (M_IPV4_CSUM_OUT|M_TCPV4_CSUM_OUT|M_UDPV4_CSUM_OUT)) != 0) {
-               rl_flags |= RL_TDESC_CMD_IPCSUM;
-               if (m->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
-                       rl_flags |= RL_TDESC_CMD_TCPCSUM;
-               if (m->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT)
-                       rl_flags |= RL_TDESC_CMD_UDPCSUM;
+               if (sc->rl_flags & RL_FLAG_DESCV2) {
+                       rl_flags |= RL_TDESC_CMD_IPCSUMV2;
+                       if (m->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
+                               rl_flags |= RL_TDESC_CMD_TCPCSUMV2;
+                       if (m->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT)
+                               rl_flags |= RL_TDESC_CMD_UDPCSUMV2;
+               } else {
+                       rl_flags |= RL_TDESC_CMD_IPCSUM;
+                       if (m->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
+                               rl_flags |= RL_TDESC_CMD_TCPCSUM;
+                       if (m->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT)
+                               rl_flags |= RL_TDESC_CMD_UDPCSUM;
+               }
        }
 
        txq = &sc->rl_ldata.rl_txq[*idx];
@@ -1634,7 +1652,8 @@ re_encap(struct rl_softc *sc, struct mbu
 
        nsegs = map->dm_nsegs;
        pad = 0;
-       if (m->m_pkthdr.len <= RL_IP4CSUMTX_PADLEN &&
+       if ((sc->rl_flags & RL_FLAG_DESCV2) == 0 &&
+           m->m_pkthdr.len <= RL_IP4CSUMTX_PADLEN &&
            (rl_flags & RL_TDESC_CMD_IPCSUM) != 0) {
                pad = 1;
                nsegs++;
Index: rtl81x9reg.h
===================================================================
RCS file: /cvs/src/sys/dev/ic/rtl81x9reg.h,v
retrieving revision 1.49
diff -u -p -r1.49 rtl81x9reg.h
--- rtl81x9reg.h        15 Jul 2008 13:21:17 -0000      1.49
+++ rtl81x9reg.h        17 Jul 2008 13:16:52 -0000
@@ -528,6 +528,10 @@ struct rl_desc {
 
 #define RL_TDESC_VLANCTL_TAG   0x00020000      /* Insert VLAN tag */
 #define RL_TDESC_VLANCTL_DATA  0x0000FFFF      /* TAG data */
+/* RTL8168C/RTL8168CP/RTL8111C/RTL8111CP */
+#define        RL_TDESC_CMD_IPCSUMV2   0x20000000
+#define        RL_TDESC_CMD_TCPCSUMV2  0x40000000
+#define        RL_TDESC_CMD_UDPCSUMV2  0x80000000
 
 /*
  * Error bits are valid only on the last descriptor of a frame
@@ -565,6 +569,8 @@ struct rl_desc {
 #define RL_RDESC_STAT_RUNT     0x00080000      /* runt packet received */
 #define RL_RDESC_STAT_CRCERR   0x00040000      /* CRC error */
 #define RL_RDESC_STAT_PROTOID  0x00030000      /* Protocol type */
+#define        RL_RDESC_STAT_UDP       0x00020000      /* UDP, 8168C/CP, 
8111C/CP */
+#define        RL_RDESC_STAT_TCP       0x00010000      /* TCP, 8168C/CP, 
8111C/CP */
 #define RL_RDESC_STAT_IPSUMBAD 0x00008000      /* IP header checksum bad */
 #define RL_RDESC_STAT_UDPSUMBAD        0x00004000      /* UDP checksum bad */
 #define RL_RDESC_STAT_TCPSUMBAD        0x00002000      /* TCP checksum bad */
@@ -576,6 +582,9 @@ struct rl_desc {
 #define RL_RDESC_VLANCTL_TAG   0x00010000      /* VLAN tag available
                                                   (rl_vlandata valid)*/
 #define RL_RDESC_VLANCTL_DATA  0x0000FFFF      /* TAG data */
+/* RTL8168C/RTL8168CP/RTL8111C/RTL8111CP */
+#define        RL_RDESC_IPV6           0x80000000
+#define        RL_RDESC_IPV4           0x40000000
 
 #define RL_PROTOID_NONIP       0x00000000
 #define RL_PROTOID_TCPIP       0x00010000

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.


<Prev in Thread] Current Thread [Next in Thread>