svn commit: r289128 - head/sys/dev/wpi
Adrian Chadd
adrian at FreeBSD.org
Sun Oct 11 01:58:52 UTC 2015
Author: adrian
Date: Sun Oct 11 01:58:50 2015
New Revision: 289128
URL: https://svnweb.freebsd.org/changeset/base/289128
Log:
wpi(4): move error handling upper (wpi_tx_data()/wpi_cmd2() -> wpi_raw_xmit()/wpi_transmit()).
Tested:
* Tested with Intel 3945BG, STA mode
Submitted by: <s3erios at gmail.com>
Differential Revision: https://reviews.freebsd.org/D3767
Modified:
head/sys/dev/wpi/if_wpi.c
Modified: head/sys/dev/wpi/if_wpi.c
==============================================================================
--- head/sys/dev/wpi/if_wpi.c Sun Oct 11 01:56:46 2015 (r289127)
+++ head/sys/dev/wpi/if_wpi.c Sun Oct 11 01:58:50 2015 (r289128)
@@ -2595,7 +2595,7 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
if (__predict_false(sc->sc_running == 0)) {
/* wpi_stop() was called */
error = ENETDOWN;
- goto fail;
+ goto end;
}
wh = mtod(buf->m, struct ieee80211_frame *);
@@ -2604,7 +2604,7 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
if (__predict_false(totlen < sizeof(struct ieee80211_frame_min))) {
error = EINVAL;
- goto fail;
+ goto end;
}
if (hdrlen & 3) {
@@ -2635,7 +2635,7 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
if (error != 0 && error != EFBIG) {
device_printf(sc->sc_dev,
"%s: can't map mbuf (error %d)\n", __func__, error);
- goto fail;
+ goto end;
}
if (error != 0) {
/* Too many DMA segments, linearize mbuf. */
@@ -2644,17 +2644,29 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
device_printf(sc->sc_dev,
"%s: could not defrag mbuf\n", __func__);
error = ENOBUFS;
- goto fail;
+ goto end;
}
buf->m = m1;
error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map,
buf->m, segs, &nsegs, BUS_DMA_NOWAIT);
if (__predict_false(error != 0)) {
+ /* XXX fix this (applicable to the iwn(4) too) */
+ /*
+ * NB: Do not return error;
+ * original mbuf does not exist anymore.
+ */
device_printf(sc->sc_dev,
"%s: can't map mbuf (error %d)\n", __func__,
error);
- goto fail;
+ if (ring->qid < WPI_CMD_QUEUE_NUM) {
+ if_inc_counter(buf->ni->ni_vap->iv_ifp,
+ IFCOUNTER_OERRORS, 1);
+ ieee80211_free_node(buf->ni);
+ }
+ m_freem(buf->m);
+ error = 0;
+ goto end;
}
}
@@ -2698,19 +2710,12 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
WPI_TXQ_STATE_UNLOCK(sc);
}
- DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
-
- WPI_TXQ_UNLOCK(sc);
-
- return 0;
-
-fail: m_freem(buf->m);
-
- DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
+end: DPRINTF(sc, WPI_DEBUG_TRACE, error ? TRACE_STR_END_ERR : TRACE_STR_END,
+ __func__);
WPI_TXQ_UNLOCK(sc);
- return error;
+ return (error);
}
/*
@@ -2731,7 +2736,7 @@ wpi_tx_data(struct wpi_softc *sc, struct
uint32_t flags;
uint16_t ac, qos;
uint8_t tid, type, rate;
- int error, swcrypt, ismcast, totlen;
+ int swcrypt, ismcast, totlen;
wh = mtod(m, struct ieee80211_frame *);
type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
@@ -2771,10 +2776,9 @@ wpi_tx_data(struct wpi_softc *sc, struct
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
/* Retrieve key for TX. */
k = ieee80211_crypto_encap(ni, m);
- if (k == NULL) {
- error = ENOBUFS;
- goto fail;
- }
+ if (k == NULL)
+ return (ENOBUFS);
+
swcrypt = k->wk_flags & IEEE80211_KEY_SWCRYPT;
/* 802.11 header may have moved. */
@@ -2843,8 +2847,7 @@ wpi_tx_data(struct wpi_softc *sc, struct
if (wn->id == WPI_ID_UNDEFINED) {
device_printf(sc->sc_dev,
"%s: undefined node id\n", __func__);
- error = EINVAL;
- goto fail;
+ return (EINVAL);
}
tx->id = wn->id;
@@ -2880,9 +2883,6 @@ wpi_tx_data(struct wpi_softc *sc, struct
tx_data.ac = ac;
return wpi_cmd2(sc, &tx_data);
-
-fail: m_freem(m);
- return error;
}
static int
@@ -2923,10 +2923,9 @@ wpi_tx_data_raw(struct wpi_softc *sc, st
if (params->ibp_flags & IEEE80211_BPF_CRYPTO) {
/* Retrieve key for TX. */
k = ieee80211_crypto_encap(ni, m);
- if (k == NULL) {
- m_freem(m);
- return ENOBUFS;
- }
+ if (k == NULL)
+ return (ENOBUFS);
+
swcrypt = k->wk_flags & IEEE80211_KEY_SWCRYPT;
/* 802.11 header may have moved. */
@@ -3026,7 +3025,6 @@ wpi_raw_xmit(struct ieee80211_node *ni,
WPI_TX_LOCK(sc);
if (sc->sc_running == 0 || wpi_tx_ring_is_full(sc, ac)) {
- m_freem(m);
error = sc->sc_running ? ENOBUFS : ENETDOWN;
goto unlock;
}
@@ -3049,6 +3047,7 @@ unlock: WPI_TX_UNLOCK(sc);
if (error != 0) {
wpi_handle_tx_failure(ni);
+ m_freem(m);
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
return error;
@@ -3087,6 +3086,7 @@ wpi_transmit(struct ieee80211com *ic, st
ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
if (wpi_tx_data(sc, m, ni) != 0) {
wpi_handle_tx_failure(ni);
+ m_freem(m);
}
DPRINTF(sc, WPI_DEBUG_XMIT, "%s: done\n", __func__);
@@ -4300,6 +4300,7 @@ wpi_config_beacon(struct wpi_vap *wvp)
device_printf(sc->sc_dev,
"%s: could not update beacon frame, error %d", __func__,
error);
+ m_freem(bcn->m);
}
/* Restore mbuf. */
More information about the svn-src-all
mailing list