Module Name:    src
Committed By:   christos
Date:           Thu Jun 16 13:01:08 UTC 2016

Modified Files:
        src/sys/dev/ic: rt2860.c

Log Message:
more conservating handling of memory.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/ic/rt2860.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/rt2860.c
diff -u src/sys/dev/ic/rt2860.c:1.11 src/sys/dev/ic/rt2860.c:1.12
--- src/sys/dev/ic/rt2860.c:1.11	Thu Jun 16 08:56:49 2016
+++ src/sys/dev/ic/rt2860.c	Thu Jun 16 09:01:08 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: rt2860.c,v 1.11 2016/06/16 12:56:49 christos Exp $	*/
+/*	$NetBSD: rt2860.c,v 1.12 2016/06/16 13:01:08 christos Exp $	*/
 /*	$OpenBSD: rt2860.c,v 1.90 2016/04/13 10:49:26 mpi Exp $	*/
 
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.11 2016/06/16 12:56:49 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.12 2016/06/16 13:01:08 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -507,12 +507,18 @@ rt2860_reset_tx_ring(struct rt2860_softc
 		if ((data = ring->data[i]) == NULL)
 			continue;	/* nothing mapped in this slot */
 
-		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
-		    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
-		bus_dmamap_unload(sc->sc_dmat, data->map);
-		m_freem(data->m);
-		data->m= NULL;
-		data->ni = NULL;	/* node already freed */
+		if (data->ni != NULL) {
+			ieee80211_free_node(data->ni);
+			data->ni = NULL;
+		}
+
+		if (data->m != NULL) {
+			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
+			    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
+			bus_dmamap_unload(sc->sc_dmat, data->map);
+			m_freem(data->m);
+			data->m = NULL;
+		}
 
 		SLIST_INSERT_HEAD(&sc->data_pool, data, next);
 		ring->data[i] = NULL;
@@ -543,13 +549,23 @@ rt2860_free_tx_ring(struct rt2860_softc 
 		if ((data = ring->data[i]) == NULL)
 			continue;	/* nothing mapped in this slot */
 
-		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
-		    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
-		bus_dmamap_unload(sc->sc_dmat, data->map);
-		m_freem(data->m);
+		if (data->ni != NULL) {
+			ieee80211_free_node(data->ni);
+			data->ni = NULL;
+		}
+		if (data->m != NULL) {
+			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
+			    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
+			bus_dmamap_unload(sc->sc_dmat, data->map);
+			m_freem(data->m);
+			data->m = NULL;
+		}
 
 		SLIST_INSERT_HEAD(&sc->data_pool, data, next);
+		ring->data[i] = NULL;
 	}
+	ring->queued = 0;
+	ring->cur = ring->next = 0;
 }
 
 /*

Reply via email to