From owner-svn-src-head@FreeBSD.ORG Wed Dec 14 22:14:05 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B8DBF106564A; Wed, 14 Dec 2011 22:14:05 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8D71B8FC08; Wed, 14 Dec 2011 22:14:05 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pBEME5kW016891; Wed, 14 Dec 2011 22:14:05 GMT (envelope-from hselasky@svn.freebsd.org) Received: (from hselasky@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pBEME5oL016889; Wed, 14 Dec 2011 22:14:05 GMT (envelope-from hselasky@svn.freebsd.org) Message-Id: <201112142214.pBEME5oL016889@svn.freebsd.org> From: Hans Petter Selasky Date: Wed, 14 Dec 2011 22:14:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r228508 - head/sys/dev/usb/wlan X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 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: Wed, 14 Dec 2011 22:14:05 -0000 Author: hselasky Date: Wed Dec 14 22:14:05 2011 New Revision: 228508 URL: http://svn.freebsd.org/changeset/base/228508 Log: Improve fix for random USB transfer time out. Suggested by: YougHyeon MFC after: 3 days Modified: head/sys/dev/usb/wlan/if_run.c Modified: head/sys/dev/usb/wlan/if_run.c ============================================================================== --- head/sys/dev/usb/wlan/if_run.c Wed Dec 14 22:04:14 2011 (r228507) +++ head/sys/dev/usb/wlan/if_run.c Wed Dec 14 22:14:05 2011 (r228508) @@ -2749,7 +2749,8 @@ tr_setup: STAILQ_REMOVE_HEAD(&pq->tx_qh, next); m = data->m; - if (m->m_pkthdr.len > RUN_MAX_TXSZ) { + if ((m->m_pkthdr.len + + sizeof(data->desc) + 3 + 8) > RUN_MAX_TXSZ) { DPRINTF("data overflow, %u bytes\n", m->m_pkthdr.len); @@ -2764,6 +2765,14 @@ tr_setup: size = sizeof(data->desc); usbd_copy_in(pc, 0, &data->desc, size); usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len); + size += m->m_pkthdr.len; + /* + * Align end on a 4-byte boundary, pad 8 bytes (CRC + + * 4-byte padding), and be sure to zero those trailing + * bytes: + */ + usbd_frame_zero(pc, size, ((-size) & 3) + 8); + size += ((-size) & 3) + 8; vap = data->ni->ni_vap; if (ieee80211_radiotap_active_vap(vap)) { @@ -2782,10 +2791,10 @@ tr_setup: ieee80211_radiotap_tx(vap, m); } - DPRINTFN(11, "sending frame len=%u @ index %d\n", - m->m_pkthdr.len, index); + DPRINTFN(11, "sending frame len=%u/%u @ index %d\n", + m->m_pkthdr.len, size, index); - usbd_xfer_set_frame_len(xfer, 0, size + m->m_pkthdr.len); + usbd_xfer_set_frame_len(xfer, 0, size); usbd_xfer_set_priv(xfer, data); usbd_transfer_submit(xfer); @@ -2874,7 +2883,6 @@ run_bulk_tx_callback5(struct usb_xfer *x static void run_set_tx_desc(struct run_softc *sc, struct run_tx_data *data) { - static const uint8_t ztail[16]; struct mbuf *m = data->m; struct ieee80211com *ic = sc->sc_ifp->if_l2com; struct ieee80211vap *vap = data->ni->ni_vap; @@ -2931,13 +2939,6 @@ run_set_tx_desc(struct run_softc *sc, st if (vap->iv_opmode != IEEE80211_M_STA && !IEEE80211_QOS_HAS_SEQ(wh)) txwi->xflags |= RT2860_TX_NSEQ; - - /* - * Align end on a 4-byte boundary, pad 8 bytes (CRC + 4-byte padding), - * and be sure to zero those trailing bytes. - */ - m_append(m, ((m->m_pkthdr.len + 3) & ~3) - m->m_pkthdr.len + 8, - (c_caddr_t)ztail); } /* This function must be called locked */