svn commit: r193403 - user/kmacy/releng_7_2_fcs/sys/dev/cxgb

Kip Macy kmacy at FreeBSD.org
Wed Jun 3 21:18:27 UTC 2009


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);


More information about the svn-src-user mailing list