svn commit: r301970 - head/sys/dev/iwm

Adrian Chadd adrian at FreeBSD.org
Thu Jun 16 17:59:16 UTC 2016


Author: adrian
Date: Thu Jun 16 17:59:15 2016
New Revision: 301970
URL: https://svnweb.freebsd.org/changeset/base/301970

Log:
  [iwm] free RX ring / NVM memory after they're used.
  
  * Free RX ring during detach
  * Free NVM memory after parsing
  
  Tested:
  
  * 7260, STA mode
  
  Submitted by:	Imre Vadasz <imre at vdsz.com>
  Approved by:	re (gjb)
  Obtained from:	dragonflybsd
  Differential Revision:	https://reviews.freebsd.org/D6817

Modified:
  head/sys/dev/iwm/if_iwm.c

Modified: head/sys/dev/iwm/if_iwm.c
==============================================================================
--- head/sys/dev/iwm/if_iwm.c	Thu Jun 16 16:26:16 2016	(r301969)
+++ head/sys/dev/iwm/if_iwm.c	Thu Jun 16 17:59:15 2016	(r301970)
@@ -1823,7 +1823,7 @@ iwm_parse_nvm_data(struct iwm_softc *sc,
 
 struct iwm_nvm_section {
 	uint16_t length;
-	const uint8_t *data;
+	uint8_t *data;
 };
 
 static int
@@ -1860,6 +1860,8 @@ iwm_nvm_init(struct iwm_softc *sc)
 	    "%s: Read NVM\n",
 	    __func__);
 
+	memset(nvm_sections, 0, sizeof(nvm_sections));
+
 	/* TODO: find correct NVM max size for a section */
 	nvm_buffer = malloc(IWM_OTP_LOW_IMAGE_SIZE, M_DEVBUF, M_NOWAIT);
 	if (nvm_buffer == NULL)
@@ -1883,10 +1885,15 @@ iwm_nvm_init(struct iwm_softc *sc)
 		nvm_sections[section].length = len;
 	}
 	free(nvm_buffer, M_DEVBUF);
-	if (error)
-		return error;
+	if (error == 0)
+		error = iwm_parse_nvm_sections(sc, nvm_sections);
 
-	return iwm_parse_nvm_sections(sc, nvm_sections);
+	for (i = 0; i < IWM_NVM_NUM_OF_SECTIONS; i++) {
+		if (nvm_sections[i].data != NULL)
+			free(nvm_sections[i].data, M_DEVBUF);
+	}
+
+	return error;
 }
 
 /*
@@ -5008,6 +5015,7 @@ iwm_detach_local(struct iwm_softc *sc, i
 		ieee80211_ifdetach(&sc->sc_ic);
 
 	/* Free descriptor rings */
+	iwm_free_rx_ring(sc, &sc->rxq);
 	for (i = 0; i < nitems(sc->txq); i++)
 		iwm_free_tx_ring(sc, &sc->txq[i]);
 


More information about the svn-src-all mailing list