summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ata/ata-all.c20
-rw-r--r--sys/dev/ata/ata-disk.c11
-rw-r--r--sys/dev/ata/ata-disk.h2
-rw-r--r--sys/dev/ata/atapi-all.c2
4 files changed, 20 insertions, 15 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index bbd1b6e..75788e9 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -212,9 +212,9 @@ ata_detach(device_t dev)
#ifdef DEV_ATADISK
if (scp->devices & ATA_ATA_MASTER && scp->dev_softc[MASTER])
- ad_detach(scp->dev_softc[MASTER]);
+ ad_detach(scp->dev_softc[MASTER], 1);
if (scp->devices & ATA_ATA_SLAVE && scp->dev_softc[SLAVE])
- ad_detach(scp->dev_softc[SLAVE]);
+ ad_detach(scp->dev_softc[SLAVE], 1);
#endif
#if defined(DEV_ATAPICD) || defined(DEV_ATAPIFD) || defined(DEV_ATAPIST)
if (scp->devices & ATA_ATAPI_MASTER && scp->dev_softc[MASTER])
@@ -494,12 +494,12 @@ ata_reset(struct ata_softc *scp)
/* do we have any signs of ATA/ATAPI HW being present ? */
ATA_OUTB(scp->r_io, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
- DELAY(1);
+ DELAY(10);
ostat0 = ATA_INB(scp->r_io, ATA_STATUS);
if ((ostat0 & 0xf8) != 0xf8 && ostat0 != 0xa5)
mask |= 0x01;
ATA_OUTB(scp->r_io, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE);
- DELAY(1);
+ DELAY(10);
ostat1 = ATA_INB(scp->r_io, ATA_STATUS);
if ((ostat1 & 0xf8) != 0xf8 && ostat1 != 0xa5)
mask |= 0x02;
@@ -619,12 +619,11 @@ ata_reinit(struct ata_softc *scp)
ata_reset(scp);
if ((misdev = devices & ~scp->devices)) {
- printf("\ndevice(s) disappeared! 0x%02x\n", misdev);
#ifdef DEV_ATADISK
if (misdev & ATA_ATA_MASTER && scp->dev_softc[MASTER])
- ad_detach(scp->dev_softc[MASTER]);
+ ad_detach(scp->dev_softc[MASTER], 0);
if (misdev & ATA_ATA_SLAVE && scp->dev_softc[SLAVE])
- ad_detach(scp->dev_softc[SLAVE]);
+ ad_detach(scp->dev_softc[SLAVE], 0);
#endif
#if defined(DEV_ATAPICD) || defined(DEV_ATAPIFD) || defined(DEV_ATAPIST)
if (misdev & ATA_ATAPI_MASTER && scp->dev_softc[MASTER])
@@ -642,7 +641,6 @@ ata_reinit(struct ata_softc *scp)
}
}
if ((newdev = ~devices & scp->devices)) {
- printf("\ndevice(s) appeared! 0x%02x\n", newdev);
if (newdev & ATA_ATA_MASTER)
if (ata_getparam(scp, ATA_MASTER, ATA_C_ATA_IDENTIFY))
newdev &= ~ATA_ATA_MASTER;
@@ -655,6 +653,8 @@ ata_reinit(struct ata_softc *scp)
if (newdev & ATA_ATAPI_SLAVE)
if (ata_getparam(scp, ATA_SLAVE, ATA_C_ATAPI_IDENTIFY))
newdev &= ~ATA_ATAPI_SLAVE;
+ if (newdev)
+ printf("\n");
}
scp->active = ATA_IDLE;
#ifdef DEV_ATADISK
@@ -716,8 +716,10 @@ ata_wait(struct ata_softc *scp, int device, u_int8_t mask)
if (scp->status == 0xff) {
ata_printf(scp, device, "no status, reselecting device\n");
ATA_OUTB(scp->r_io, ATA_DRIVE, ATA_D_IBM | device);
- DELAY(1);
+ DELAY(10);
scp->status = ATA_INB(scp->r_io, ATA_STATUS);
+ if (scp->status == 0xff)
+ return -1;
}
/* are we done ? */
diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c
index 359681b..e7d15ed 100644
--- a/sys/dev/ata/ata-disk.c
+++ b/sys/dev/ata/ata-disk.c
@@ -207,12 +207,13 @@ ad_attach(struct ata_softc *scp, int device)
}
void
-ad_detach(struct ad_softc *adp)
+ad_detach(struct ad_softc *adp, int flush)
{
struct ad_request *request;
struct bio *bp;
adp->flags |= AD_F_DETACHING;
+ printf("\nad%d: being removed from configuration", adp->lun);
TAILQ_FOREACH(request, &adp->controller->ata_queue, chain) {
if (request->device != adp)
continue;
@@ -230,9 +231,11 @@ ad_detach(struct ad_softc *adp)
disk_invalidate(&adp->disk);
disk_destroy(adp->dev);
devstat_remove_entry(&adp->stats);
- if (ata_command(adp->controller, adp->unit, ATA_C_FLUSHCACHE,
- 0, 0, 0, 0, 0, ATA_WAIT_INTR))
- printf("ad%d: flushing cache on detach failed\n", adp->lun);
+ if (flush) {
+ if (ata_command(adp->controller, adp->unit, ATA_C_FLUSHCACHE,
+ 0, 0, 0, 0, 0, ATA_WAIT_INTR))
+ printf("ad%d: flushing cache on detach failed\n", adp->lun);
+ }
ata_free_lun(&adp_lun_map, adp->lun);
adp->controller->dev_softc[ATA_DEV(adp->unit)] = NULL;
free(adp, M_AD);
diff --git a/sys/dev/ata/ata-disk.h b/sys/dev/ata/ata-disk.h
index 6d760cd..a638de0 100644
--- a/sys/dev/ata/ata-disk.h
+++ b/sys/dev/ata/ata-disk.h
@@ -79,7 +79,7 @@ struct ad_softc {
};
void ad_attach(struct ata_softc *, int);
-void ad_detach(struct ad_softc *);
+void ad_detach(struct ad_softc *, int);
void ad_start(struct ad_softc *);
int ad_transfer(struct ad_request *);
int ad_interrupt(struct ad_request *);
diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c
index 4eec739..002288b 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -126,7 +126,7 @@ atapi_detach(struct atapi_softc *atp)
struct atapi_request *request;
atp->flags |= ATAPI_F_DETACHING;
-
+ printf("\n%s: being removed from configuration", atp->devname);
switch (ATP_PARAM->device_type) {
#ifdef DEV_ATAPICD
case ATAPI_TYPE_CDROM:
OpenPOWER on IntegriCloud