summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2003-05-03 18:28:43 +0000
committersos <sos@FreeBSD.org>2003-05-03 18:28:43 +0000
commit7113858cc752a0d0c37bba9a3ead02f89a580a71 (patch)
treeb2d9088f78ec5077a04b28ea69f83a6be36f9cc4
parent43f1ae07c352d18f538f54a84413ba7476a5e43f (diff)
downloadFreeBSD-src-7113858cc752a0d0c37bba9a3ead02f89a580a71.zip
FreeBSD-src-7113858cc752a0d0c37bba9a3ead02f89a580a71.tar.gz
Fix locking on reinit.
-rw-r--r--sys/dev/ata/ata-all.c20
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]);
OpenPOWER on IntegriCloud