diff options
author | sos <sos@FreeBSD.org> | 2003-05-03 18:28:43 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2003-05-03 18:28:43 +0000 |
commit | 7113858cc752a0d0c37bba9a3ead02f89a580a71 (patch) | |
tree | b2d9088f78ec5077a04b28ea69f83a6be36f9cc4 | |
parent | 43f1ae07c352d18f538f54a84413ba7476a5e43f (diff) | |
download | FreeBSD-src-7113858cc752a0d0c37bba9a3ead02f89a580a71.zip FreeBSD-src-7113858cc752a0d0c37bba9a3ead02f89a580a71.tar.gz |
Fix locking on reinit.
-rw-r--r-- | sys/dev/ata/ata-all.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 16c0229..c3dbe6e 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -858,28 +858,40 @@ ata_reinit(struct ata_channel *ch) } newdev = ~devices & ch->devices; #ifdef DEV_ATADISK - if (newdev & ATA_ATA_SLAVE && !ch->device[SLAVE].driver) + if (newdev & ATA_ATA_SLAVE && !ch->device[SLAVE].driver) { + ATA_UNLOCK_CH(ch); ad_attach(&ch->device[SLAVE]); + ATA_SLEEPLOCK_CH(ch, ATA_CONTROL); + } else if (ch->devices & (ATA_ATA_SLAVE) && ch->device[SLAVE].driver) { ata_getparam(&ch->device[SLAVE], ATA_C_ATA_IDENTIFY); ad_reinit(&ch->device[SLAVE]); } - if (newdev & ATA_ATA_MASTER && !ch->device[MASTER].driver) + if (newdev & ATA_ATA_MASTER && !ch->device[MASTER].driver) { + ATA_UNLOCK_CH(ch); ad_attach(&ch->device[MASTER]); + ATA_SLEEPLOCK_CH(ch, ATA_CONTROL); + } else if (ch->devices & ATA_ATA_MASTER && ch->device[MASTER].driver) { ata_getparam(&ch->device[MASTER], ATA_C_ATA_IDENTIFY); ad_reinit(&ch->device[MASTER]); } #endif #if DEV_ATAPIALL - if (newdev & ATA_ATAPI_SLAVE && !ch->device[SLAVE].driver) + if (newdev & ATA_ATAPI_SLAVE && !ch->device[SLAVE].driver) { + ATA_UNLOCK_CH(ch); atapi_attach(&ch->device[SLAVE]); + ATA_SLEEPLOCK_CH(ch, ATA_CONTROL); + } else if (ch->devices & (ATA_ATAPI_SLAVE) && ch->device[SLAVE].driver) { ata_getparam(&ch->device[SLAVE], ATA_C_ATAPI_IDENTIFY); atapi_reinit(&ch->device[SLAVE]); } - if (newdev & ATA_ATAPI_MASTER && !ch->device[MASTER].driver) + if (newdev & ATA_ATAPI_MASTER && !ch->device[MASTER].driver) { + ATA_UNLOCK_CH(ch); atapi_attach(&ch->device[MASTER]); + ATA_SLEEPLOCK_CH(ch, ATA_CONTROL); + } else if (ch->devices & (ATA_ATAPI_MASTER) && ch->device[MASTER].driver) { ata_getparam(&ch->device[MASTER], ATA_C_ATAPI_IDENTIFY); atapi_reinit(&ch->device[MASTER]); |