From owner-svn-src-projects@FreeBSD.ORG Thu Aug 22 06:52:00 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 7CBD0CE3; Thu, 22 Aug 2013 06:52:00 +0000 (UTC) (envelope-from bryanv@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 5AAF022DC; Thu, 22 Aug 2013 06:52:00 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7M6q0IU098936; Thu, 22 Aug 2013 06:52:00 GMT (envelope-from bryanv@svn.freebsd.org) Received: (from bryanv@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7M6q0tT098928; Thu, 22 Aug 2013 06:52:00 GMT (envelope-from bryanv@svn.freebsd.org) Message-Id: <201308220652.r7M6q0tT098928@svn.freebsd.org> From: Bryan Venteicher Date: Thu, 22 Aug 2013 06:52:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254647 - projects/vmxnet/sys/dev/vmware/vmxnet3 X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Aug 2013 06:52:00 -0000 Author: bryanv Date: Thu Aug 22 06:51:59 2013 New Revision: 254647 URL: http://svnweb.freebsd.org/changeset/base/254647 Log: Fix interrupt handling if auto mask is not enabled And add macros for compiling on older releases that were missed in a previous commit. Modified: projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmxvar.h Modified: projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c ============================================================================== --- projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c Thu Aug 22 06:50:04 2013 (r254646) +++ projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmx.c Thu Aug 22 06:51:59 2013 (r254647) @@ -1307,7 +1307,7 @@ vmxnet3_init_shared_data(struct vmxnet3_ ds->nrxsg_max = sc->vmx_max_rxsegs; /* Interrupt control. */ - ds->automask = 1; /* VMXNET3_IMM_AUTO */ + ds->automask = sc->vmx_intr_mask_mode == VMXNET3_IMM_AUTO; ds->nintr = sc->vmx_nintrs; ds->evintr = sc->vmx_event_intr_idx; ds->ictrl = VMXNET3_ICTRL_DISABLE_ALL; @@ -1617,11 +1617,11 @@ vmxnet3_newbuf(struct vmxnet3_softc *sc, } else { #if __FreeBSD_version < 902001 /* - * These mbufs will never be used for the start of a - * frame. However, roughly prior to branching releng/9.2, - * bus_dmamap_load_mbuf_sg() required the mbuf to always be - * a packet header. Avoid unnecessary mbuf initialization - * in newer versions where that is not the case. + * These mbufs will never be used for the start of a frame. + * Roughly prior to branching releng/9.2, the load_mbuf_sg() + * required the mbuf to always be a packet header. Avoid + * unnecessary mbuf initialization in newer versions where + * that is not the case. */ flags = M_PKTHDR; #else @@ -1632,8 +1632,10 @@ vmxnet3_newbuf(struct vmxnet3_softc *sc, } m = m_getjcl(M_NOWAIT, MT_DATA, flags, clsize); - if (m == NULL) + if (m == NULL) { + sc->vmx_stats.vmst_getcl_failed++; return (ENOBUFS); + } if (btype == VMXNET3_BTYPE_HEAD) { m->m_len = m->m_pkthdr.len = clsize; @@ -1916,6 +1918,8 @@ vmxnet3_legacy_intr(void *xsc) if (vmxnet3_read_bar1(sc, VMXNET3_BAR1_INTR) == 0) return; } + if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE) + vmxnet3_disable_all_intrs(sc); if (sc->vmx_ds->event != 0) vmxnet3_evintr(sc); @@ -1930,7 +1934,7 @@ vmxnet3_legacy_intr(void *xsc) vmxnet3_start_locked(ifp); VMXNET3_TXQ_UNLOCK(txq); - vmxnet3_enable_intr(sc, 0); + vmxnet3_enable_all_intrs(sc); } static void @@ -1944,6 +1948,9 @@ vmxnet3_txq_intr(void *xtxq) sc = txq->vxtxq_sc; ifp = sc->vmx_ifp; + if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE) + vmxnet3_disable_intr(sc, txq->vxtxq_intr_idx); + VMXNET3_TXQ_LOCK(txq); vmxnet3_txq_eof(txq); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) @@ -1962,6 +1969,9 @@ vmxnet3_rxq_intr(void *xrxq) rxq = xrxq; sc = rxq->vxrxq_sc; + if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE) + vmxnet3_disable_intr(sc, rxq->vxrxq_intr_idx); + VMXNET3_RXQ_LOCK(rxq); vmxnet3_rxq_eof(rxq); VMXNET3_RXQ_UNLOCK(rxq); @@ -1976,6 +1986,9 @@ vmxnet3_event_intr(void *xsc) sc = xsc; + if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE) + vmxnet3_disable_intr(sc, sc->vmx_event_intr_idx); + if (sc->vmx_ds->event != 0) vmxnet3_evintr(sc); @@ -2102,7 +2115,7 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc, struct ifnet *ifp; struct vmxnet3_rxring *rxr; struct vmxnet3_comp_ring *rxc; - int i, npopulate, idx, frame_size, error; + int i, populate, idx, frame_size, error; ifp = sc->vmx_ifp; frame_size = ifp->if_mtu + sizeof(struct ether_vlan_header); @@ -2117,7 +2130,7 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc, * to make our life easier. We do not support changing the ring * size after the attach. */ - if (frame_size <= MCLBYTES) + if (frame_size <= MCLBYTES - ETHER_ALIGN) sc->vmx_rx_max_chain = 1; else sc->vmx_rx_max_chain = 2; @@ -2129,11 +2142,11 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc, */ if ((ifp->if_capenable & IFCAP_LRO) == 0 && frame_size <= MCLBYTES + MJUMPAGESIZE) - npopulate = 1; + populate = 1; else - npopulate = VMXNET3_RXRINGS_PERQ; + populate = VMXNET3_RXRINGS_PERQ; - for (i = 0; i < npopulate; i++) { + for (i = 0; i < populate; i++) { rxr = &rxq->vxrxq_cmd_ring[i]; rxr->vxrxr_fill = 0; rxr->vxrxr_gen = VMXNET3_INIT_GEN; @@ -3103,6 +3116,8 @@ vmxnet3_setup_sysctl(struct vmxnet3_soft stats = &sc->vmx_stats; SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "collapsed", CTLFLAG_RD, &stats->vmst_collapsed, "Tx mbuf chains collapsed"); + SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "getcl_failed", CTLFLAG_RD, + &stats->vmst_getcl_failed, "Alloc of mbuf cluster failed"); vmxnet3_setup_queue_sysctl(sc, ctx, child); } Modified: projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmxvar.h ============================================================================== --- projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmxvar.h Thu Aug 22 06:50:04 2013 (r254646) +++ projects/vmxnet/sys/dev/vmware/vmxnet3/if_vmxvar.h Thu Aug 22 06:51:59 2013 (r254647) @@ -167,6 +167,7 @@ struct vmxnet3_rxqueue { struct vmxnet3_statistics { uint64_t vmst_collapsed; + uint64_t vmst_getcl_failed; }; @@ -286,4 +287,28 @@ struct vmxnet3_softc { #define VMXNET3_CSUM_ALL_OFFLOAD \ (VMXNET3_CSUM_OFFLOAD | VMXNET3_CSUM_OFFLOAD_IPV6 | CSUM_TSO) +/* + * Compat macros to keep this driver compiling on old releases. + */ + +#if !defined(SYSCTL_ADD_UQUAD) +#define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD +#endif + +#if !defined(IFCAP_TXCSUM_IPV6) +#define IFCAP_TXCSUM_IPV6 0 +#endif + +#if !defined(IFCAP_RXCSUM_IPV6) +#define IFCAP_RXCSUM_IPV6 0 +#endif + +#if !defined(CSUM_TCP_IPV6) +#define CSUM_TCP_IPV6 0 +#endif + +#if !defined(CSUM_UDP_IPV6) +#define CSUM_UDP_IPV6 0 +#endif + #endif /* _IF_VMXVAR_H */