Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Oct 2015 00:52:41 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r288999 - head/sys/dev/wpi
Message-ID:  <201510080052.t980qf7P034702@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Thu Oct  8 00:52:41 2015
New Revision: 288999
URL: https://svnweb.freebsd.org/changeset/base/288999

Log:
  wpi(4): remove software queues
  
  Use direct dispatch into the destination hardware ring instead of using
  a staging queue.
  
  Submitted by:	<s3erios@gmail.com>
  Differential Revision:	https://reviews.freebsd.org/D3757

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	Thu Oct  8 00:48:29 2015	(r288998)
+++ head/sys/dev/wpi/if_wpi.c	Thu Oct  8 00:52:41 2015	(r288999)
@@ -206,7 +206,6 @@ static int	wpi_tx_data_raw(struct wpi_so
 static int	wpi_raw_xmit(struct ieee80211_node *, struct mbuf *,
 		    const struct ieee80211_bpf_params *);
 static int	wpi_transmit(struct ieee80211com *, struct mbuf *);
-static void	wpi_start(void *, int);
 static void	wpi_watchdog_rfkill(void *);
 static void	wpi_scan_timeout(void *);
 static void	wpi_tx_timeout(void *);
@@ -525,7 +524,6 @@ wpi_attach(device_t dev)
 	TASK_INIT(&sc->sc_reinittask, 0, wpi_hw_reset, sc);
 	TASK_INIT(&sc->sc_radiooff_task, 0, wpi_radio_off, sc);
 	TASK_INIT(&sc->sc_radioon_task, 0, wpi_radio_on, sc);
-	TASK_INIT(&sc->sc_start_task, 0, wpi_start, sc);
 
 	sc->sc_tq = taskqueue_create("wpi_taskq", M_WAITOK,
 	    taskqueue_thread_enqueue, &sc->sc_tq);
@@ -685,7 +683,6 @@ wpi_detach(device_t dev)
 
 	if (ic->ic_vap_create == wpi_vap_create) {
 		ieee80211_draintask(ic, &sc->sc_radioon_task);
-		ieee80211_draintask(ic, &sc->sc_start_task);
 
 		wpi_stop(sc);
 
@@ -1165,7 +1162,6 @@ wpi_alloc_tx_ring(struct wpi_softc *sc, 
 	ring->queued = 0;
 	ring->cur = 0;
 	ring->update = 0;
-	mbufq_init(&ring->snd, ifqmaxlen);
 
 	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
 
@@ -1293,8 +1289,6 @@ wpi_reset_tx_ring(struct wpi_softc *sc, 
 	memset(ring->desc, 0, ring->desc_dma.size);
 	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
 	    BUS_DMASYNC_PREWRITE);
-	mbufq_drain(&ring->snd);
-	sc->qfullmsk &= ~(1 << ring->qid);
 	ring->queued = 0;
 	ring->cur = 0;
 	ring->update = 0;
@@ -2104,16 +2098,9 @@ wpi_tx_done(struct wpi_softc *sc, struct
 	ieee80211_tx_complete(ni, m, (status & WPI_TX_STATUS_FAIL) != 0);
 
 	WPI_TXQ_STATE_LOCK(sc);
-	ring->queued -= 1;
-	if (ring->queued > 0) {
+	if (--ring->queued > 0)
 		callout_reset(&sc->tx_timeout, 5*hz, wpi_tx_timeout, sc);
-
-		if ((sc->qfullmsk & (1 << ring->qid)) != 0 &&
-		     ring->queued < WPI_TX_RING_LOMARK) {
-			sc->qfullmsk &= ~(1 << ring->qid);
-			ieee80211_runtask(ic, &sc->sc_start_task);
-		}
-	} else
+	else
 		callout_stop(&sc->tx_timeout);
 	WPI_TXQ_STATE_UNLOCK(sc);
 
@@ -2692,10 +2679,8 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
 	sc->sc_update_tx_ring(sc, ring);
 
 	if (ring->qid < WPI_CMD_QUEUE_NUM) {
-		/* Mark TX ring as full if we reach a certain threshold. */
 		WPI_TXQ_STATE_LOCK(sc);
-		if (++ring->queued > WPI_TX_RING_HIMARK)
-			sc->qfullmsk |= 1 << ring->qid;
+		ring->queued++;
 		callout_reset(&sc->tx_timeout, 5*hz, wpi_tx_timeout, sc);
 		WPI_TXQ_STATE_UNLOCK(sc);
 	}
@@ -3063,7 +3048,6 @@ wpi_transmit(struct ieee80211com *ic, st
 {
 	struct wpi_softc *sc = ic->ic_softc;
 	struct ieee80211_node *ni;
-	struct mbufq *sndq;
 	int ac, error;
 
 	WPI_TX_LOCK(sc);
@@ -3077,10 +3061,8 @@ wpi_transmit(struct ieee80211com *ic, st
 
 	/* Check for available space. */
 	ac = M_WME_GETAC(m);
-	sndq = &sc->txq[ac].snd;
-	if (wpi_tx_ring_is_full(sc, ac) || mbufq_len(sndq) != 0) {
-		/* wpi_tx_done() will dequeue it. */
-		error = mbufq_enqueue(sndq, m);
+	if (wpi_tx_ring_is_full(sc, ac)) {
+		error = ENOBUFS;
 		goto unlock;
 	}
 
@@ -3097,44 +3079,6 @@ unlock:	WPI_TX_UNLOCK(sc);
 	return (error);
 }
 
-/**
- * Process data waiting to be sent on the output queue
- */
-static void
-wpi_start(void *arg0, int pending)
-{
-	struct wpi_softc *sc = arg0;
-	struct ieee80211_node *ni;
-	struct mbuf *m;
-	uint8_t i;
-
-	WPI_TX_LOCK(sc);
-	if (sc->sc_running == 0)
-		goto unlock;
-
-	DPRINTF(sc, WPI_DEBUG_XMIT, "%s: called\n", __func__);
-
-	for (i = 0; i < WPI_CMD_QUEUE_NUM; i++) {
-		struct mbufq *sndq = &sc->txq[i].snd;
-
-		for (;;) {
-			if (wpi_tx_ring_is_full(sc, i))
-				break;
-
-			if ((m = mbufq_dequeue(sndq)) == NULL)
-				break;
-
-			ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
-			if (wpi_tx_data(sc, m, ni) != 0) {
-				wpi_handle_tx_failure(ni);
-			}
-		}
-	}
-
-	DPRINTF(sc, WPI_DEBUG_XMIT, "%s: done\n", __func__);
-unlock:	WPI_TX_UNLOCK(sc);
-}
-
 static void
 wpi_watchdog_rfkill(void *arg)
 {

Modified: head/sys/dev/wpi/if_wpivar.h
==============================================================================
--- head/sys/dev/wpi/if_wpivar.h	Thu Oct  8 00:48:29 2015	(r288998)
+++ head/sys/dev/wpi/if_wpivar.h	Thu Oct  8 00:52:41 2015	(r288999)
@@ -72,7 +72,6 @@ struct wpi_tx_ring {
 	struct wpi_tx_cmd	*cmd;
 	struct wpi_tx_data	data[WPI_TX_RING_COUNT];
 	bus_dma_tag_t		data_dmat;
-	struct mbufq		snd;
 	int			qid;
 	int			queued;
 	int			cur;
@@ -188,7 +187,6 @@ struct wpi_softc {
 
 	/* TX Thermal Callibration. */
 	struct callout		calib_to;
-	int			calib_cnt;
 
 	struct callout		scan_timeout;
 	struct callout		tx_timeout;
@@ -212,7 +210,6 @@ struct wpi_softc {
 	struct mtx		rxon_mtx;
 
 	int			temp;
-	uint32_t		qfullmsk;
 
 	uint32_t		nodesmsk;
 	struct mtx		nt_mtx;
@@ -235,7 +232,6 @@ struct wpi_softc {
 	struct task		sc_reinittask;
 	struct task		sc_radiooff_task;
 	struct task		sc_radioon_task;
-	struct task		sc_start_task;
 
 	/* Taskqueue */
 	struct taskqueue	*sc_tq;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510080052.t980qf7P034702>