Mercurial > illumos > illumos-gate
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);