git: 0d0726a769a1 - stable/13 - e1000: Fix lem/em UDP rx csum offload
Kevin Bowling
kbowling at FreeBSD.org
Mon Aug 16 00:57:24 UTC 2021
The branch stable/13 has been updated by kbowling (ports committer):
URL: https://cgit.FreeBSD.org/src/commit/?id=0d0726a769a176be699b2ceeb5a417ffe88b0e64
commit 0d0726a769a176be699b2ceeb5a417ffe88b0e64
Author: Kevin Bowling <kbowling at FreeBSD.org>
AuthorDate: 2021-08-09 21:29:31 +0000
Commit: Kevin Bowling <kbowling at FreeBSD.org>
CommitDate: 2021-08-16 00:56:45 +0000
e1000: Fix lem/em UDP rx csum offload
Rebase on igb code and unify lem/em implementations.
PR: 257642
Reported by: Nick Reilly <nreilly at blackberry.com>
Reviewed by: karels, emaste
Tested by: Nick Reilly <nreilly at blackberry.com>
Approved by: grehan
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D31449
(cherry picked from commit 015075f383489fcbedbe8aae7c1c64a3d55ca75e)
---
sys/dev/e1000/em_txrx.c | 67 ++++++++++++++++---------------------------------
1 file changed, 21 insertions(+), 46 deletions(-)
diff --git a/sys/dev/e1000/em_txrx.c b/sys/dev/e1000/em_txrx.c
index 458de96a7b9d..11f6662c5b79 100644
--- a/sys/dev/e1000/em_txrx.c
+++ b/sys/dev/e1000/em_txrx.c
@@ -62,8 +62,7 @@ static int lem_isc_rxd_available(void *arg, uint16_t rxqid, qidx_t idx,
qidx_t budget);
static int lem_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri);
-static void lem_receive_checksum(int status, int errors, if_rxd_info_t ri);
-static void em_receive_checksum(uint32_t status, if_rxd_info_t ri);
+static void em_receive_checksum(uint16_t, uint8_t, if_rxd_info_t);
static int em_determine_rsstype(u32 pkt_info);
extern int em_intr(void *arg);
@@ -646,8 +645,8 @@ lem_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
} while (!eop);
/* XXX add a faster way to look this up */
- if (adapter->hw.mac.type >= e1000_82543 && !(status & E1000_RXD_STAT_IXSM))
- lem_receive_checksum(status, errors, ri);
+ if (adapter->hw.mac.type >= e1000_82543)
+ em_receive_checksum(status, errors, ri);
if (status & E1000_RXD_STAT_VP) {
ri->iri_vtag = le16toh(rxd->special);
@@ -707,9 +706,7 @@ em_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
i++;
} while (!eop);
- /* XXX add a faster way to look this up */
- if (adapter->hw.mac.type >= e1000_82543)
- em_receive_checksum(staterr, ri);
+ em_receive_checksum(staterr, staterr >> 24, ri);
if (staterr & E1000_RXD_STAT_VP) {
vtag = le16toh(rxd->wb.upper.vlan);
@@ -734,19 +731,24 @@ em_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
*
*********************************************************************/
static void
-lem_receive_checksum(int status, int errors, if_rxd_info_t ri)
+em_receive_checksum(uint16_t status, uint8_t errors, if_rxd_info_t ri)
{
- /* Did it pass? */
- if (status & E1000_RXD_STAT_IPCS && !(errors & E1000_RXD_ERR_IPE))
- ri->iri_csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID);
-
- if (status & E1000_RXD_STAT_TCPCS) {
- /* Did it pass? */
- if (!(errors & E1000_RXD_ERR_TCPE)) {
- ri->iri_csum_flags |=
- (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
- ri->iri_csum_data = htons(0xffff);
- }
+ if (__predict_false(status & E1000_RXD_STAT_IXSM))
+ return;
+
+ /* If there is a layer 3 or 4 error we are done */
+ if (__predict_false(errors & (E1000_RXD_ERR_IPE | E1000_RXD_ERR_TCPE)))
+ return;
+
+ /* IP Checksum Good */
+ if (status & E1000_RXD_STAT_IPCS)
+ ri->iri_csum_flags = (CSUM_IP_CHECKED | CSUM_IP_VALID);
+
+ /* Valid L4E checksum */
+ if (__predict_true(status &
+ (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS))) {
+ ri->iri_csum_flags |= CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
+ ri->iri_csum_data = htons(0xffff);
}
}
@@ -775,30 +777,3 @@ em_determine_rsstype(u32 pkt_info)
return M_HASHTYPE_OPAQUE;
}
}
-
-static void
-em_receive_checksum(uint32_t status, if_rxd_info_t ri)
-{
- ri->iri_csum_flags = 0;
-
- /* Ignore Checksum bit is set */
- if (status & E1000_RXD_STAT_IXSM)
- return;
-
- /* If the IP checksum exists and there is no IP Checksum error */
- if ((status & (E1000_RXD_STAT_IPCS | E1000_RXDEXT_STATERR_IPE)) ==
- E1000_RXD_STAT_IPCS) {
- ri->iri_csum_flags = (CSUM_IP_CHECKED | CSUM_IP_VALID);
- }
-
- /* TCP or UDP checksum */
- if ((status & (E1000_RXD_STAT_TCPCS | E1000_RXDEXT_STATERR_TCPE)) ==
- E1000_RXD_STAT_TCPCS) {
- ri->iri_csum_flags |= (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
- ri->iri_csum_data = htons(0xffff);
- }
- if (status & E1000_RXD_STAT_UDPCS) {
- ri->iri_csum_flags |= (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
- ri->iri_csum_data = htons(0xffff);
- }
-}
More information about the dev-commits-src-all
mailing list