[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[patch] hw checksumming for nge
- To: <tech@openbsd.org>
- Subject: [patch] hw checksumming for nge
- From: rt <rtecco@umich.edu>
- Date: Tue, 3 Jul 2001 17:39:11 -0400 (EDT)
- Content-ID: <Pine.SOL.4.33.0107031738580.2324@joust.gpcc.itd.umich.edu>
attached is a patch against -current that turns on hardware checksumming
for the national semi. gigabit cards. RX checksums for TCP, UDP and IP and
TX checksums for IP are now turned on by default. there are also a couple
minor artifacts that i cleaned up.
if this looks acceptable, could someone please commit it?
thx,
rt
-------------
ryan tecco
--- if_nge.c.orig Tue Jul 3 11:56:32 2001
+++ if_nge.c Tue Jul 3 17:05:11 2001
@@ -124,8 +124,6 @@
#include <dev/pci/if_ngereg.h>
-#define NGE_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP)
-
int nge_probe __P((struct device *, void *, void *));
void nge_attach __P((struct device *, struct device *, void *));
@@ -905,6 +903,7 @@
ifp->if_watchdog = nge_watchdog;
ifp->if_baudrate = 1000000000;
ifp->if_snd.ifq_maxlen = NGE_TX_LIST_CNT - 1;
+ ifp->if_capabilities = IFCAP_CSUM_IPv4;
DPRINTFN(5, ("bcopy\n"));
bcopy(sc->sc_dv.dv_xname, ifp->if_xname, IFNAMSIZ);
@@ -1279,13 +1278,22 @@
bpf_mtap(ifp->if_bpf, m);
#endif
-#ifdef NGE_CSUM_OFFLOAD
/* Do IP checksum checking. */
- if (extsts & NGE_RXEXTSTS_IPPKT)
- m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
- if (!(extsts & NGE_RXEXTSTS_IPCSUMERR))
- m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
-#endif
+ if ((extsts & NGE_RXEXTSTS_IPPKT) &&
+ !(extsts & NGE_RXEXTSTS_IPCSUMERR))
+ m->m_pkthdr.csum |= M_IPV4_CSUM_IN_OK;
+ else
+ m->m_pkthdr.csum |= M_IPV4_CSUM_IN_BAD;
+ if ((extsts & NGE_RXEXTSTS_TCPPKT) &&
+ !(extsts & NGE_RXEXTSTS_TCPCSUMERR))
+ m->m_pkthdr.csum |= M_TCP_CSUM_IN_OK;
+ else
+ m->m_pkthdr.csum |= M_TCP_CSUM_IN_BAD;
+ if ((extsts & NGE_RXEXTSTS_UDPPKT) &&
+ !(extsts & NGE_RXEXTSTS_UDPCSUMERR))
+ m->m_pkthdr.csum |= M_UDP_CSUM_IN_OK;
+ else
+ m->m_pkthdr.csum |= M_UDP_CSUM_IN_BAD;
#if NVLAN > 0
/*
@@ -1541,7 +1549,23 @@
if (m != NULL)
return(ENOBUFS);
- sc->nge_ldata->nge_tx_list[cur].nge_extsts = 0;
+ /*
+ * Card handles checksumming on a packet by packet
+ * basis.
+ */
+ if (m_head->m_pkthdr.csum) {
+ if (m_head->m_pkthdr.csum & M_IPV4_CSUM_OUT)
+ sc->nge_ldata->nge_tx_list[*txidx].nge_extsts |=
+ NGE_TXEXTSTS_IPCSUM;
+#if 0
+ if (m_head->m_pkthdr.csum & M_TCPV4_CSUM_OUT)
+ sc->nge_ldata->nge_tx_list[*txidx].nge_extsts |=
+ NGE_TXEXTSTS_TCPCSUM;
+ if (m_head->m_pkthdr.csum & M_UDPV4_CSUM_OUT)
+ sc->nge_ldata->nge_tx_list[*txidx].nge_extsts |=
+ NGE_TXEXTSTS_UDPCSUM;
+#endif
+ }
#if NVLAN > 0
if (ifv != NULL) {
@@ -1712,9 +1736,7 @@
* Enable hardware checksum validation for all IPv4
* packets, do not reject packets with bad checksums.
*/
-#ifdef NGE_CSUM_OFFLOAD
CSR_WRITE_4(sc, NGE_VLAN_IP_RXCTL, NGE_VIPRXCTL_IPCSUM_ENB);
-#endif
#if NVLAN > 0
/*
@@ -1733,9 +1755,7 @@
/*
* Enable TX IPv4 checksumming on a per-packet basis.
*/
-#ifdef NGE_CSUM_OFFLOAD
CSR_WRITE_4(sc, NGE_VLAN_IP_TXCTL, NGE_VIPTXCTL_CSUM_PER_PKT);
-#endif
#if NVLAN > 0
/*
@@ -1759,10 +1779,12 @@
/*
* Enable the delivery of PHY interrupts based on
- * link/speed/duplex status changes.
+ * link/speed/duplex status changes and enable return
+ * of extended status information in the DMA descriptors,
+ * required for checksum offloading.
*/
NGE_SETBIT(sc, NGE_CFG, NGE_CFG_PHYINTR_SPD|NGE_CFG_PHYINTR_LNK|
- NGE_CFG_PHYINTR_DUP);
+ NGE_CFG_PHYINTR_DUP|NGE_CFG_EXTSTS_ENB);
DPRINTFN("NGE_CFG: 0x%08X\n", CSR_READ_4(sc, NGE_CFG));