changeset 11104:166a083c78c5

6900065 System crash when running diskomizer on disks connected to host via SIL3726 6900563 sata_scsi_start() should not dispatch task queue in SLEEP mode 6901892 Cannot recognize port multiplier disks after "cfgadm connect" them
author Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
date Thu, 19 Nov 2009 16:54:57 +0800
parents 3b3f33a37cab
children 398a2edaa773
files usr/src/uts/common/io/sata/adapters/ahci/ahci.c usr/src/uts/common/io/sata/impl/sata.c
diffstat 2 files changed, 7 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/sata/adapters/ahci/ahci.c	Thu Nov 19 05:07:17 2009 -0800
+++ b/usr/src/uts/common/io/sata/adapters/ahci/ahci.c	Thu Nov 19 16:54:57 2009 +0800
@@ -1319,7 +1319,8 @@
 	} else if (sd->satadev_addr.qual & SATA_ADDR_PMULT) {
 		/* Check pmports hotplug events */
 		(void) ahci_probe_pmult(ahci_ctlp, ahci_portp, &addr);
-	} else if (sd->satadev_addr.qual & SATA_ADDR_PMPORT) {
+	} else if (sd->satadev_addr.qual & (SATA_ADDR_PMPORT |
+	    SATA_ADDR_DPMPORT)) {
 		if (ahci_probe_pmport(ahci_ctlp, ahci_portp,
 		    &addr, sd) != AHCI_SUCCESS) {
 			rval = SATA_FAILURE;
--- a/usr/src/uts/common/io/sata/impl/sata.c	Thu Nov 19 05:07:17 2009 -0800
+++ b/usr/src/uts/common/io/sata/impl/sata.c	Thu Nov 19 16:54:57 2009 +0800
@@ -2433,7 +2433,7 @@
 			/* scsi callback required */
 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
 			    (task_func_t *)pkt->pkt_comp,
-			    (void *)pkt, TQ_SLEEP) == NULL)
+			    (void *)pkt, TQ_NOSLEEP) == NULL)
 				/* Scheduling the callback failed */
 				return (TRAN_BUSY);
 			return (TRAN_ACCEPT);
@@ -6196,8 +6196,8 @@
 		 * because original packet's sata address refered to a device
 		 * attached to some port.
 		 */
-		if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
-		    sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
+		if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
+		    sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
 			mutex_enter(&pmportinfo->pmport_mutex);
 			sata_update_pmport_info(sata_hba_inst, sata_device);
@@ -10622,7 +10622,6 @@
 	mutex_enter(&cportinfo->cport_mutex);
 
 	/* dev_type's not updated when get called from sata_reprobe_port() */
-	cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
 	if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
 		/* Create a pmult_info structure */
 		SATA_CPORTINFO_PMULT_INFO(cportinfo) =
@@ -10699,6 +10698,7 @@
 
 	pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
 	pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
+	cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
 
 	mutex_exit(&cportinfo->cport_mutex);
 	return (SATA_SUCCESS);
@@ -10727,6 +10727,7 @@
 	/* This function might be called while port-mult is hot plugged. */
 	mutex_enter(&cportinfo->cport_mutex);
 
+	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
 	pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
 	ASSERT(pmultinfo != NULL);
 
@@ -10812,7 +10813,6 @@
 	kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
 
 	cportinfo->cport_devp.cport_sata_pmult = NULL;
-	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
 
 	sata_log(sata_hba_inst, CE_WARN,
 	    "SATA port multiplier detached at port %d", cport);