svn commit: r210208 - stable/8/sys/dev/ata

Alexander Motin mav at FreeBSD.org
Sun Jul 18 07:23:01 UTC 2010


Author: mav
Date: Sun Jul 18 07:23:00 2010
New Revision: 210208
URL: http://svn.freebsd.org/changeset/base/210208

Log:
  MFC r209883, r209944:
  Make interrupt handler check that CAM bus initialization completed before
  touching it. It fixes possible panic during controller attach in ATA_CAM
  mode.
  
  While there, slightly improve attach errors handling.

Modified:
  stable/8/sys/dev/ata/ata-all.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/ata/ata-all.c
==============================================================================
--- stable/8/sys/dev/ata/ata-all.c	Sun Jul 18 07:19:23 2010	(r210207)
+++ stable/8/sys/dev/ata/ata-all.c	Sun Jul 18 07:23:00 2010	(r210208)
@@ -195,6 +195,7 @@ ata_attach(device_t dev)
     }
     if ((error = bus_setup_intr(dev, ch->r_irq, ATA_INTR_FLAGS, NULL,
 				ata_interrupt, ch, &ch->ih))) {
+	bus_release_resource(dev, SYS_RES_IRQ, rid, ch->r_irq);
 	device_printf(dev, "unable to setup interrupt\n");
 	return error;
     }
@@ -218,8 +219,9 @@ ata_attach(device_t dev)
 	    device_get_unit(dev), &ch->state_mtx, 1, 0, devq);
 	if (ch->sim == NULL) {
 		device_printf(dev, "unable to allocate sim\n");
+		cam_simq_free(devq);
 		error = ENOMEM;
-		goto err2;
+		goto err1;
 	}
 	if (xpt_bus_register(ch->sim, dev, 0) != CAM_SUCCESS) {
 		device_printf(dev, "unable to register xpt bus\n");
@@ -239,8 +241,9 @@ err3:
 	xpt_bus_deregister(cam_sim_path(ch->sim));
 err2:
 	cam_sim_free(ch->sim, /*free_devq*/TRUE);
+	ch->sim = NULL;
 err1:
-	bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq);
+	bus_release_resource(dev, SYS_RES_IRQ, rid, ch->r_irq);
 	mtx_unlock(&ch->state_mtx);
 	return (error);
 #endif
@@ -281,6 +284,7 @@ ata_detach(device_t dev)
 	xpt_free_path(ch->path);
 	xpt_bus_deregister(cam_sim_path(ch->sim));
 	cam_sim_free(ch->sim, /*free_devq*/TRUE);
+	ch->sim = NULL;
 	mtx_unlock(&ch->state_mtx);
 #endif
 
@@ -307,9 +311,12 @@ ata_conn_event(void *context, int dummy)
 	union ccb *ccb;
 
 	mtx_lock(&ch->state_mtx);
+	if (ch->sim == NULL) {
+		mtx_unlock(&ch->state_mtx);
+		return;
+	}
 	ata_reinit(dev);
-	mtx_unlock(&ch->state_mtx);
-	if ((ccb = xpt_alloc_ccb()) == NULL)
+	if ((ccb = xpt_alloc_ccb_nowait()) == NULL)
 		return;
 	if (xpt_create_path(&ccb->ccb_h.path, NULL,
 	    cam_sim_path(ch->sim),
@@ -318,6 +325,7 @@ ata_conn_event(void *context, int dummy)
 		return;
 	}
 	xpt_rescan(ccb);
+	mtx_unlock(&ch->state_mtx);
 #else
 	ata_reinit(dev);
 #endif


More information about the svn-src-all mailing list