Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-9]: src/sys/dev/ic Pull up following revision(s) (requested by ms...
details: https://anonhg.NetBSD.org/src/rev/0dd70808ec87
branches: netbsd-9
changeset: 963498:0dd70808ec87
user: martin <martin%NetBSD.org@localhost>
date: Wed Jan 08 11:50:57 2020 +0000
description:
Pull up following revision(s) (requested by msaitoh in ticket #610):
sys/dev/ic/gem.c: revision 1.124
Fix error path in gem(4)'s TX checksum offload.
- Avoid accessing free'd m0 on error. Use m_freem() instead of m_free().
Reported by maxv@.
- Tested by martin@, macallan@ and jdc@.
diffstat:
sys/dev/ic/gem.c | 24 +++++++++++++-----------
1 files changed, 13 insertions(+), 11 deletions(-)
diffs (70 lines):
diff -r abc9087c1fb4 -r 0dd70808ec87 sys/dev/ic/gem.c
--- a/sys/dev/ic/gem.c Wed Jan 08 07:58:48 2020 +0000
+++ b/sys/dev/ic/gem.c Wed Jan 08 11:50:57 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: gem.c,v 1.120 2019/05/28 08:59:34 msaitoh Exp $ */
+/* $NetBSD: gem.c,v 1.120.2.1 2020/01/08 11:50:57 martin Exp $ */
/*
*
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.120 2019/05/28 08:59:34 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.120.2.1 2020/01/08 11:50:57 martin Exp $");
#include "opt_inet.h"
@@ -1389,6 +1389,7 @@
* until we drain the queue, or use up all available transmit
* descriptors.
*/
+next:
while ((txs = SIMPLEQ_FIRST(&sc->sc_txfreeq)) != NULL &&
sc->sc_txfree != 0) {
/*
@@ -1498,16 +1499,9 @@
* and the checksum stuff if we want the hardware
* to do it.
*/
- sc->sc_txdescs[nexttx].gd_addr =
- GEM_DMA_WRITE(sc, dmamap->dm_segs[seg].ds_addr);
flags = dmamap->dm_segs[seg].ds_len & GEM_TD_BUFSIZE;
if (nexttx == firsttx) {
flags |= GEM_TD_START_OF_PACKET;
- if (++sc->sc_txwin > GEM_NTXSEGS * 2 / 3) {
- sc->sc_txwin = 0;
- flags |= GEM_TD_INTERRUPT_ME;
- }
-
#ifdef INET
/* h/w checksum */
if (ifp->if_csum_flags_tx & M_CSUM_TCPv4 &&
@@ -1526,8 +1520,10 @@
break;
default:
/* unsupported, drop it */
- m_free(m0);
- continue;
+ bus_dmamap_unload(sc->sc_dmatag,
+ dmamap);
+ m_freem(m0);
+ goto next;
}
start += M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
offset = M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data) + start;
@@ -1538,7 +1534,13 @@
GEM_TD_CXSUM_ENABLE;
}
#endif
+ if (++sc->sc_txwin > GEM_NTXSEGS * 2 / 3) {
+ sc->sc_txwin = 0;
+ flags |= GEM_TD_INTERRUPT_ME;
+ }
}
+ sc->sc_txdescs[nexttx].gd_addr =
+ GEM_DMA_WRITE(sc, dmamap->dm_segs[seg].ds_addr);
if (seg == dmamap->dm_nsegs - 1) {
flags |= GEM_TD_END_OF_PACKET;
} else {
Home |
Main Index |
Thread Index |
Old Index