From owner-svn-src-head@freebsd.org Sun Oct 11 01:58:52 2015 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 5401BA0FB31; Sun, 11 Oct 2015 01:58:52 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 10FEC1542; Sun, 11 Oct 2015 01:58:51 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id t9B1wpwx030165; Sun, 11 Oct 2015 01:58:51 GMT (envelope-from adrian@FreeBSD.org) Received: (from adrian@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id t9B1wpjd030164; Sun, 11 Oct 2015 01:58:51 GMT (envelope-from adrian@FreeBSD.org) Message-Id: <201510110158.t9B1wpjd030164@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: adrian set sender to adrian@FreeBSD.org using -f From: Adrian Chadd Date: Sun, 11 Oct 2015 01:58:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r289128 - head/sys/dev/wpi X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Oct 2015 01:58:52 -0000 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: 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. */