From owner-svn-src-user@FreeBSD.ORG Wed Jun 3 21:18:27 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 663C91065693; Wed, 3 Jun 2009 21:18:27 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 54EDC8FC17; Wed, 3 Jun 2009 21:18:27 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n53LIRTP067205; Wed, 3 Jun 2009 21:18:27 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n53LIR6f067203; Wed, 3 Jun 2009 21:18:27 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200906032118.n53LIR6f067203@svn.freebsd.org> From: Kip Macy Date: Wed, 3 Jun 2009 21:18:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193403 - user/kmacy/releng_7_2_fcs/sys/dev/cxgb X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Jun 2009 21:18:27 -0000 Author: kmacy Date: Wed Jun 3 21:18:27 2009 New Revision: 193403 URL: http://svn.freebsd.org/changeset/base/193403 Log: move interrupt initialization out from under adapter and port locks Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h Wed Jun 3 21:11:51 2009 (r193402) +++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h Wed Jun 3 21:18:27 2009 (r193403) @@ -128,6 +128,7 @@ enum { /* adapter flags */ CXGB_OFLD_INIT = (1 << 7), TP_PARITY_INIT = (1 << 8), INIT_IN_PROGRESS = (1 << 9), + INTR_INIT_DONE = (1 << 10), }; #define FL_Q_SIZE 4096 Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c Wed Jun 3 21:11:51 2009 (r193402) +++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c Wed Jun 3 21:18:27 2009 (r193403) @@ -1676,32 +1676,6 @@ cxgb_up(struct adapter *sc) { int err = 0; - t3_intr_clear(sc); - - /* If it's MSI or INTx, allocate a single interrupt for everything */ - if ((sc->flags & USING_MSIX) == 0) { - if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, - &sc->irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(sc->dev, "Cannot allocate interrupt rid=%d\n", - sc->irq_rid); - err = EINVAL; - goto out; - } - device_printf(sc->dev, "allocated irq_res=%p\n", sc->irq_res); - - if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET, -#ifdef INTR_FILTERS - NULL, -#endif - sc->cxgb_intr, sc, &sc->intr_tag)) { - device_printf(sc->dev, "Cannot set up interrupt\n"); - err = EINVAL; - goto irq_err; - } - } else { - cxgb_setup_msix(sc, sc->msi_count); - } - t3_sge_start(sc); t3_intr_enable(sc); @@ -1714,17 +1688,13 @@ cxgb_up(struct adapter *sc) F_CMCACHEPERR | F_ARPLUTPERR); t3_write_reg(sc, A_TP_INT_ENABLE, 0x7fbfffff); } - if (!(sc->flags & QUEUES_BOUND)) { bind_qsets(sc); sc->flags |= QUEUES_BOUND; } -out: + return (err); -irq_err: - CH_ERR(sc, "request_irq failed, err %d\n", err); - goto out; } @@ -1879,6 +1849,51 @@ out: return (err); } +static int +cxgb_intr_init(struct adapter *sc) +{ + int err = 0; + + ADAPTER_LOCK(sc); + sc->flags |= INIT_IN_PROGRESS; + ADAPTER_UNLOCK(sc); + + t3_intr_clear(sc); + + /* If it's MSI or INTx, allocate a single interrupt for everything */ + if ((sc->flags & USING_MSIX) == 0) { + if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, + &sc->irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { + device_printf(sc->dev, "Cannot allocate interrupt rid=%d\n", + sc->irq_rid); + err = EINVAL; + goto out; + } + device_printf(sc->dev, "allocated irq_res=%p\n", sc->irq_res); + + if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET, +#ifdef INTR_FILTERS + NULL, +#endif + sc->cxgb_intr, sc, &sc->intr_tag)) { + device_printf(sc->dev, "Cannot set up interrupt\n"); + err = EINVAL; + CH_ERR(sc, "request_irq failed, err %d\n", err); + goto out; + } + } else { + cxgb_setup_msix(sc, sc->msi_count); + } + + ADAPTER_LOCK(sc); + sc->flags &= ~INIT_IN_PROGRESS; + sc->flags |= INTR_INIT_DONE; + ADAPTER_UNLOCK(sc); +out: + return (err); +} + + static void cxgb_init(void *arg) { @@ -1888,7 +1903,11 @@ cxgb_init(void *arg) if (((sc->flags & FULL_INIT_DONE) == 0) && (cxgb_first_init(sc))) return; - + + if (((sc->flags & INTR_INIT_DONE) == 0) && + (cxgb_intr_init(sc))) + return; + PORT_LOCK(p); cxgb_init_locked(p); PORT_UNLOCK(p);