Author: adrian Date: Sun Mar 15 20:34:26 2015 New Revision: 280069 URL: https://svnweb.freebsd.org/changeset/base/280069
Log: Replace kernel unit allocator with local set of functions. PR: kern/197143 Submitted by: Andriy Voskoboinyk <s3er...@gmail.com> Modified: head/sys/dev/wpi/if_wpi.c head/sys/dev/wpi/if_wpivar.h Modified: head/sys/dev/wpi/if_wpi.c ============================================================================== --- head/sys/dev/wpi/if_wpi.c Sun Mar 15 20:33:13 2015 (r280068) +++ head/sys/dev/wpi/if_wpi.c Sun Mar 15 20:34:26 2015 (r280069) @@ -169,6 +169,7 @@ static int wpi_setregdomain(struct ieee8 struct ieee80211_regdomain *, int, struct ieee80211_channel[]); static int wpi_read_eeprom_group(struct wpi_softc *, int); +static int wpi_add_node_entry_adhoc(struct wpi_softc *); static void wpi_node_free(struct ieee80211_node *); static struct ieee80211_node *wpi_node_alloc(struct ieee80211vap *, const uint8_t mac[IEEE80211_ADDR_LEN]); @@ -384,8 +385,6 @@ wpi_attach(device_t dev) WPI_LOCK_INIT(sc); - sc->sc_unr = new_unrhdr(WPI_ID_IBSS_MIN, WPI_ID_IBSS_MAX, &sc->sc_mtx); - /* Allocate DMA memory for firmware transfers. */ if ((error = wpi_alloc_fwmem(sc)) != 0) { device_printf(dev, @@ -679,8 +678,6 @@ wpi_detach(device_t dev) if (ifp != NULL) if_free(ifp); - delete_unrhdr(sc->sc_unr); - DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__); WPI_LOCK_DESTROY(sc); return 0; @@ -1514,6 +1511,42 @@ wpi_read_eeprom_group(struct wpi_softc * return 0; } +static int +wpi_add_node_entry_adhoc(struct wpi_softc *sc) +{ + int newid = WPI_ID_IBSS_MIN; + + for (; newid <= WPI_ID_IBSS_MAX; newid++) { + if ((sc->nodesmsk & (1 << newid)) == 0) { + sc->nodesmsk |= 1 << newid; + return newid; + } + } + + return WPI_ID_UNDEFINED; +} + +static __inline int +wpi_check_node_entry(struct wpi_softc *sc, uint8_t id) +{ + if (id == WPI_ID_UNDEFINED) + return 0; + + return (sc->nodesmsk >> id) & 1; +} + +static __inline void +wpi_clear_node_table(struct wpi_softc *sc) +{ + sc->nodesmsk = 0; +} + +static __inline void +wpi_del_node_entry(struct wpi_softc *sc, uint8_t id) +{ + sc->nodesmsk &= ~(1 << id); +} + static struct ieee80211_node * wpi_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) { @@ -1538,11 +1571,11 @@ wpi_node_free(struct ieee80211_node *ni) struct wpi_node *wn = WPI_NODE(ni); if (wn->id >= WPI_ID_IBSS_MIN && wn->id <= WPI_ID_IBSS_MAX) { - free_unr(sc->sc_unr, wn->id); - WPI_LOCK(sc); - if (sc->rxon.filter & htole32(WPI_FILTER_BSS)) + if (wpi_check_node_entry(sc, wn->id)) { + wpi_del_node_entry(sc, wn->id); wpi_del_node(sc, ni); + } WPI_UNLOCK(sc); } @@ -2050,6 +2083,7 @@ wpi_notif_intr(struct wpi_softc *sc) le32toh(*status)); if (le32toh(*status) & 1) { + wpi_clear_node_table(sc); ieee80211_runtask(ic, &sc->sc_radiooff_task); return; } @@ -3001,18 +3035,25 @@ static int wpi_add_ibss_node(struct wpi_softc *sc, struct ieee80211_node *ni) { struct wpi_node *wn = WPI_NODE(ni); + int error; DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__); if (wn->id != WPI_ID_UNDEFINED) return EINVAL; - wn->id = alloc_unrl(sc->sc_unr); + if ((wn->id = wpi_add_node_entry_adhoc(sc)) == WPI_ID_UNDEFINED) { + device_printf(sc->sc_dev, "%s: h/w table is full\n", __func__); + return ENOMEM; + } - if (wn->id == (uint8_t)-1) - return ENOBUFS; + if ((error = wpi_add_node(sc, ni)) != 0) { + wpi_del_node_entry(sc, wn->id); + wn->id = WPI_ID_UNDEFINED; + return error; + } - return wpi_add_node(sc, ni); + return 0; } static void @@ -3404,6 +3445,8 @@ wpi_send_rxon(struct wpi_softc *sc, int } else { error = wpi_cmd(sc, WPI_CMD_RXON, &sc->rxon, sizeof (struct wpi_rxon), async); + + wpi_clear_node_table(sc); } if (error != 0) { device_printf(sc->sc_dev, "RXON command failed, error %d\n", Modified: head/sys/dev/wpi/if_wpivar.h ============================================================================== --- head/sys/dev/wpi/if_wpivar.h Sun Mar 15 20:33:13 2015 (r280068) +++ head/sys/dev/wpi/if_wpivar.h Sun Mar 15 20:34:26 2015 (r280069) @@ -151,7 +151,6 @@ struct wpi_softc { int sc_debug; struct mtx sc_mtx; - struct unrhdr *sc_unr; /* Flags indicating the current state the driver * expects the hardware to be in @@ -189,6 +188,7 @@ struct wpi_softc { struct wpi_rxon rxon; int temp; uint32_t qfullmsk; + uint32_t nodesmsk; int sc_tx_timer; int sc_scan_timer; _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"