diff options
author | phk <phk@FreeBSD.org> | 2005-01-06 23:36:43 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2005-01-06 23:36:43 +0000 |
commit | 538dbb8988cd6d902d0f9a1bbb95b0b103a81f66 (patch) | |
tree | 83b0014b66130c63c751dc7f500ef4b6650ddfab | |
parent | 20280f143170ee08a1e2cbd8871550105b276674 (diff) | |
download | FreeBSD-src-538dbb8988cd6d902d0f9a1bbb95b0b103a81f66.zip FreeBSD-src-538dbb8988cd6d902d0f9a1bbb95b0b103a81f66.tar.gz |
Simplify and fix bugs in rx/tx ring cleanup.
-rw-r--r-- | sys/pci/if_sis.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/sys/pci/if_sis.c b/sys/pci/if_sis.c index c68cc0a..53aa74c 100644 --- a/sys/pci/if_sis.c +++ b/sys/pci/if_sis.c @@ -2182,8 +2182,9 @@ sis_watchdog(struct ifnet *ifp) static void sis_stop(struct sis_softc *sc) { - int i; - struct ifnet *ifp; + int i; + struct ifnet *ifp; + struct sis_desc *dp; if (sc->sis_stopped) return; @@ -2210,35 +2211,31 @@ sis_stop(struct sis_softc *sc) /* * Free data in the RX lists. */ - for (i = 0; i < SIS_RX_LIST_CNT; i++) { - if (sc->sis_rx_list[i].sis_mbuf != NULL) { - bus_dmamap_unload(sc->sis_tag, - sc->sis_rx_list[i].sis_map); - bus_dmamap_destroy(sc->sis_tag, - sc->sis_rx_list[i].sis_map); - m_freem(sc->sis_rx_list[i].sis_mbuf); - sc->sis_rx_list[i].sis_mbuf = NULL; - } + dp = &sc->sis_rx_list[0]; + for (i = 0; i < SIS_RX_LIST_CNT; i++, dp++) { + if (dp->sis_mbuf == NULL) + continue; + bus_dmamap_unload(sc->sis_tag, dp->sis_map); + bus_dmamap_destroy(sc->sis_tag, dp->sis_map); + m_freem(dp->sis_mbuf); + dp->sis_mbuf = NULL; } - bzero(sc->sis_rx_list, - sizeof(sc->sis_rx_list)); + bzero(sc->sis_rx_list, SIS_RX_LIST_SZ); /* * Free the TX list buffers. */ - for (i = 0; i < SIS_TX_LIST_CNT; i++) { - if (sc->sis_tx_list[i].sis_mbuf != NULL) { - bus_dmamap_unload(sc->sis_tag, - sc->sis_tx_list[i].sis_map); - bus_dmamap_destroy(sc->sis_tag, - sc->sis_tx_list[i].sis_map); - m_freem(sc->sis_tx_list[i].sis_mbuf); - sc->sis_tx_list[i].sis_mbuf = NULL; - } + dp = &sc->sis_tx_list[0]; + for (i = 0; i < SIS_TX_LIST_CNT; i++, dp++) { + if (dp->sis_mbuf == NULL) + continue; + bus_dmamap_unload(sc->sis_tag, dp->sis_map); + bus_dmamap_destroy(sc->sis_tag, dp->sis_map); + m_freem(dp->sis_mbuf); + dp->sis_mbuf = NULL; } - bzero(sc->sis_tx_list, - sizeof(sc->sis_tx_list)); + bzero(sc->sis_tx_list, SIS_TX_LIST_SZ); sc->sis_stopped = 1; } |