diff options
author | yt160523 <none@none> | 2006-11-13 22:02:07 -0800 |
---|---|---|
committer | yt160523 <none@none> | 2006-11-13 22:02:07 -0800 |
commit | 415e5120fdbacf132d1845300d92a6cd74eed2fa (patch) | |
tree | 577e7c84c8e59448b382c9e333e4b90fde04b81d /usr/src | |
parent | 8347601bcb0a439f6e50fc36b4039a73d08700e1 (diff) | |
download | illumos-gate-415e5120fdbacf132d1845300d92a6cd74eed2fa.tar.gz |
6488114 system panic after unplugging disks during diskomizer/dd run
6489740 Dump kernel fails at SATA framework-compliant hba driver (si3124 driver)
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/sata/adapters/si3124/si3124.c | 3 | ||||
-rw-r--r-- | usr/src/uts/common/io/sata/impl/sata.c | 32 |
2 files changed, 18 insertions, 17 deletions
diff --git a/usr/src/uts/common/io/sata/adapters/si3124/si3124.c b/usr/src/uts/common/io/sata/adapters/si3124/si3124.c index 4a97140e0f..1794ceba2a 100644 --- a/usr/src/uts/common/io/sata/adapters/si3124/si3124.c +++ b/usr/src/uts/common/io/sata/adapters/si3124/si3124.c @@ -1201,7 +1201,8 @@ si_tran_start(dev_info_t *dip, sata_pkt_t *spkt) } if (si_portp->siport_reset_in_progress && - ! spkt->satapkt_cmd.satacmd_flags.sata_ignore_dev_reset) { + ! spkt->satapkt_cmd.satacmd_flags.sata_ignore_dev_reset && + ! ddi_in_panic()) { spkt->satapkt_reason = SATA_PKT_BUSY; SIDBG1(SIDBG_ERRS, si_ctlp, diff --git a/usr/src/uts/common/io/sata/impl/sata.c b/usr/src/uts/common/io/sata/impl/sata.c index ecdd68c599..2a34a51795 100644 --- a/usr/src/uts/common/io/sata/impl/sata.c +++ b/usr/src/uts/common/io/sata/impl/sata.c @@ -3413,8 +3413,9 @@ sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx) * If device is in reset condition, reject the packet with * TRAN_BUSY */ - if (sdinfo->satadrv_event_flags & - (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) { + if ((sdinfo->satadrv_event_flags & + (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) && + !ddi_in_panic()) { spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE; SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "sata_scsi_start: rejecting command because " @@ -5472,7 +5473,7 @@ sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx) static int sata_hba_start(sata_pkt_txlate_t *spx, int *rval) { - int stat; + int stat, cport; sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst; sata_drive_info_t *sdinfo; sata_device_t *sata_device; @@ -5480,8 +5481,9 @@ sata_hba_start(sata_pkt_txlate_t *spx, int *rval) struct sata_cmd_flags cmd_flags; ASSERT(spx->txlt_sata_pkt != NULL); - ASSERT(mutex_owned(&SATA_CPORT_MUTEX(spx->txlt_sata_hba_inst, - spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport))); + + cport = SATA_TXLT_CPORT(spx); + ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport))); sdinfo = sata_get_device_info(sata_hba_inst, &spx->txlt_sata_pkt->satapkt_device); @@ -5499,8 +5501,7 @@ sata_hba_start(sata_pkt_txlate_t *spx, int *rval) cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags; sata_device = &spx->txlt_sata_pkt->satapkt_device; - mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, - sdinfo->satadrv_addr.cport))); + mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "Sata cmd 0x%2x\n", cmd); @@ -5508,8 +5509,8 @@ sata_hba_start(sata_pkt_txlate_t *spx, int *rval) stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spx->txlt_sata_pkt); - mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, - sdinfo->satadrv_addr.cport))); + mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); + sdinfo = sata_get_device_info(sata_hba_inst, sata_device); /* * If sata pkt was accepted and executed in asynchronous mode, i.e. * with the sata callback, the sata_pkt could be already destroyed @@ -5579,17 +5580,16 @@ sata_hba_start(sata_pkt_txlate_t *spx, int *rval) * that rejected the command, command was not sent to * an attached device. */ - mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, - sdinfo->satadrv_addr.cport))); - (void) sata_txlt_invalid_command(spx); - mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, - sdinfo->satadrv_addr.cport))); - - if (sdinfo->satadrv_state & SATA_DSTATE_RESET) + if ((sdinfo != NULL) && + (sdinfo->satadrv_state & SATA_DSTATE_RESET)) SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, "sat_hba_start: cmd 0x%2x rejected " "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd); + mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); + (void) sata_txlt_invalid_command(spx); + mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); + *rval = TRAN_ACCEPT; break; |