From owner-p4-projects@FreeBSD.ORG Wed Jun 3 20:47:34 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EB04A1065678; Wed, 3 Jun 2009 20:47:33 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AAF771065676 for ; Wed, 3 Jun 2009 20:47:33 +0000 (UTC) (envelope-from marius@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 98D998FC1D for ; Wed, 3 Jun 2009 20:47:33 +0000 (UTC) (envelope-from marius@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n53KlXmF041808 for ; Wed, 3 Jun 2009 20:47:33 GMT (envelope-from marius@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n53KlXKU041806 for perforce@freebsd.org; Wed, 3 Jun 2009 20:47:33 GMT (envelope-from marius@freebsd.org) Date: Wed, 3 Jun 2009 20:47:33 GMT Message-Id: <200906032047.n53KlXKU041806@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marius@freebsd.org using -f From: Marius Strobl To: Perforce Change Reviews Cc: Subject: PERFORCE change 163445 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Jun 2009 20:47:34 -0000 http://perforce.freebsd.org/chv.cgi?CH=163445 Change 163445 by marius@flak on 2009/06/03 20:46:59 - As intended increase sc_txwin by number of TX descriptors actually used instead of just by one. - Add missing BUS_DMASYNC_PREREAD before returning RX descriptors to the hardware but don't BUS_DMASYNC_POSTREAD if we're not going to use it. - Avoid recursive locking when cas_free() is called via m_freem(9) from within this driver. - Use MEXTADD(9) with M_RDONLY in order to avoid the kernel using the mbuf for other purposes. - Fix some minor nits. Affected files ... .. //depot/projects/usiii/dev/cas/if_cas.c#4 edit .. //depot/projects/usiii/dev/cas/if_casreg.h#5 edit .. //depot/projects/usiii/dev/cas/if_casvar.h#4 edit Differences ... ==== //depot/projects/usiii/dev/cas/if_cas.c#4 (text+ko) ==== @@ -117,7 +117,7 @@ * According to documentation, the hardware has support for basic TCP * checksum offloading only, in practice this can be also used for UDP * however (i.e. the problem of previous Sun NICs that a checksum of 0x0 - * was not converted to 0xffff no longer exists). + * is not converted to 0xffff no longer exists). */ #define CAS_CSUM_FEATURES (CSUM_TCP | CSUM_UDP) @@ -1238,7 +1238,7 @@ CTR3(KTR_CAS, "%s: start of frame at segment %d, TX %d", __func__, seg, nexttx); #endif - if (++sc->sc_txwin > CAS_NTXSEGS * 2 / 3) { + if (sc->sc_txwin += nsegs > CAS_NTXSEGS * 2 / 3) { sc->sc_txwin = 0; sc->sc_txdescs[txs->txs_firstdesc].cd_flags |= htole64(cflags | CAS_TD_START_OF_FRAME | CAS_TD_INT_ME); @@ -1668,10 +1668,10 @@ #endif rxds = &sc->sc_rxdsoft[idx]; MGETHDR(m, M_DONTWAIT, MT_DATA); - bus_dmamap_sync(sc->sc_rdmatag, rxds->rxds_dmamap, - BUS_DMASYNC_POSTREAD); if (m != NULL) { refcount_acquire(&rxds->rxds_refcount); + bus_dmamap_sync(sc->sc_rdmatag, + rxds->rxds_dmamap, BUS_DMASYNC_POSTREAD); MEXTADD(m, (caddr_t)rxds->rxds_buf + off * 256 + ETHER_ALIGN, len, cas_free, #if __FreeBSD_version < 800016 @@ -1679,7 +1679,7 @@ #else sc, (void *)(uintptr_t)idx, #endif - 0, EXT_NET_DRV); + M_RDONLY, EXT_NET_DRV); if ((m->m_flags & M_EXT) == 0) { m_freem(m); m = NULL; @@ -1711,12 +1711,12 @@ #endif rxds = &sc->sc_rxdsoft[idx]; MGETHDR(m, M_DONTWAIT, MT_DATA); - bus_dmamap_sync(sc->sc_rdmatag, rxds->rxds_dmamap, - BUS_DMASYNC_POSTREAD); if (m != NULL) { refcount_acquire(&rxds->rxds_refcount); off += ETHER_ALIGN; m->m_len = min(CAS_PAGE_SIZE - off, len); + bus_dmamap_sync(sc->sc_rdmatag, + rxds->rxds_dmamap, BUS_DMASYNC_POSTREAD); MEXTADD(m, (caddr_t)rxds->rxds_buf + off, m->m_len, cas_free, #if __FreeBSD_version < 800016 @@ -1724,7 +1724,7 @@ #else sc, (void *)(uintptr_t)idx, #endif - 0, EXT_NET_DRV); + M_RDONLY, EXT_NET_DRV); if ((m->m_flags & M_EXT) == 0) { m_freem(m); m = NULL; @@ -1744,13 +1744,13 @@ #endif rxds2 = &sc->sc_rxdsoft[idx2]; MGET(m2, M_DONTWAIT, MT_DATA); - bus_dmamap_sync(sc->sc_rdmatag, - rxds2->rxds_dmamap, - BUS_DMASYNC_POSTREAD); if (m2 != NULL) { refcount_acquire( &rxds2->rxds_refcount); m2->m_len = len - m->m_len; + bus_dmamap_sync(sc->sc_rdmatag, + rxds2->rxds_dmamap, + BUS_DMASYNC_POSTREAD); MEXTADD(m2, (caddr_t)rxds2->rxds_buf, m2->m_len, cas_free, #if __FreeBSD_version < 800016 @@ -1758,7 +1758,7 @@ #else sc, (void *)(uintptr_t)idx2, #endif - 0, EXT_NET_DRV); + M_RDONLY, EXT_NET_DRV); if ((m2->m_flags & M_EXT) == 0) { m_freem(m2); m2 = NULL; @@ -1817,7 +1817,7 @@ { struct cas_rxdsoft *rxds; struct cas_softc *sc; - u_int idx; + u_int idx, locked; #if __FreeBSD_version < 800016 rxds = arg2; @@ -1831,9 +1831,15 @@ if (refcount_release(&rxds->rxds_refcount) == 0) return; - CAS_LOCK(sc); + /* + * NB: this function can be called via m_freem(9) within + * this driver! + */ + if ((locked = CAS_LOCK_OWNED(sc)) == 0) + CAS_LOCK(sc); cas_add_rxdesc(sc, idx); - CAS_UNLOCK(sc); + if (locked == 0) + CAS_UNLOCK(sc); } static inline void @@ -1842,6 +1848,8 @@ CAS_LOCK_ASSERT(sc, MA_OWNED); + bus_dmamap_sync(sc->sc_rdmatag, sc->sc_rxdsoft[idx].rxds_dmamap, + BUS_DMASYNC_PREREAD); CAS_UPDATE_RXDESC(sc, sc->sc_rxdptr, idx); sc->sc_rxdptr = CAS_NEXTRXDESC(sc->sc_rxdptr); ==== //depot/projects/usiii/dev/cas/if_casreg.h#5 (text+ko) ==== @@ -3,7 +3,6 @@ * Copyright (c) 2008 Marius Strobl * All rights reserved. * - * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -26,7 +25,7 @@ * SUCH DAMAGE. * * from: NetBSD: gemreg.h,v 1.8 2005/12/11 12:21:26 christos Exp - * from: FreeBSD: if_gemvar.h 174987 2007-12-30 01:32:03Z marius + * from: FreeBSD: if_gemreg.h 174987 2007-12-30 01:32:03Z marius * * $FreeBSD$ */ @@ -39,7 +38,7 @@ * DP83065 Saturn Gigabit Ethernet controllers */ -/* glocal resources */ +/* global resources */ #define CAS_CAW 0x0004 /* core arbitration weight */ #define CAS_INF_BURST 0x0008 /* infinite burst enable */ #define CAS_STATUS 0x000c /* interrupt status */ @@ -420,7 +419,7 @@ #define CAS_RX_RED_10K_12K_MASK 0xff000000 /* 10K < FIFO threshold < 12K */ #define CAS_RX_RED_10K_12K_SHFT 24 -/* CAS_RX_FF_IPP_MASK and CAS_RX_FF_FIFO_MASK is in 8 bytes granularity. */ +/* CAS_RX_FF_IPP_MASK and CAS_RX_FF_FIFO_MASK are in 8 bytes granularity. */ #define CAS_RX_FF_PKT_MASK 0x000000ff /* # of packets in RX FIFO */ #define CAS_RX_FF_PKT_SHFT 0 #define CAS_RX_FF_IPP_MASK 0x0007ff00 /* IPP FIFO level */ @@ -828,8 +827,7 @@ #define CAS_PCS_CONF_JS_NORM 0x00000000 /* jitter study - normal op. */ #define CAS_PCS_CONF_JS_HF 0x00000008 /* jitter study - HF test */ #define CAS_PCS_CONF_JS_LF 0x00000010 /* jitter study - LF test */ -#define CAS_PCS_CONF_JS_MASK \ - (CAS_PCS_CONF_JS_HF | CAS_PCS_CONF_JS_LF) +#define CAS_PCS_CONF_JS_MASK (CAS_PCS_CONF_JS_HF | CAS_PCS_CONF_JS_LF) #define CAS_PCS_CONF_ANEG_TO 0x00000020 /* auto-neg. timer override */ #define CAS_PCS_SM_TX_CTRL_MASK 0x0000000f /* TX control state */ ==== //depot/projects/usiii/dev/cas/if_casvar.h#4 (text+ko) ==== @@ -239,9 +239,8 @@ #if __FreeBSD_version < 800016 #define CAS_INIT_RXDESC(sc, d, s) \ do { \ - struct cas_rxdsoft *__rxds; \ + struct cas_rxdsoft *__rxds = &(sc)->sc_rxdsoft[(s)]; \ \ - __rxds = &(sc)->sc_rxdsoft[(s)]; \ __rxds->rxds_sc = (sc); \ __rxds->rxds_idx = (s); \ __CAS_UPDATE_RXDESC(&(sc)->sc_rxdescs[(d)], __rxds, (s)); \ @@ -256,5 +255,6 @@ #define CAS_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) #define CAS_LOCK_ASSERT(_sc, _what) mtx_assert(&(_sc)->sc_mtx, (_what)) #define CAS_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx) +#define CAS_LOCK_OWNED(_sc) mtx_owned(&(_sc)->sc_mtx) #endif