From 375e076b124d154e00acfe8407b40c53e9baa533 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=B8ren=20Schmidt?= Date: Sun, 2 Nov 2003 22:04:53 +0000 Subject: [PATCH] On ATA control commands return the registers in the request. --- sys/dev/ata/ata-lowlevel.c | 80 +++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/sys/dev/ata/ata-lowlevel.c b/sys/dev/ata/ata-lowlevel.c index be41fa99fa4..0f6efade806 100644 --- a/sys/dev/ata/ata-lowlevel.c +++ b/sys/dev/ata/ata-lowlevel.c @@ -304,56 +304,64 @@ ata_interrupt(void *data) /* clear interrupt and get status */ request->status = ATA_IDX_INB(ch, ATA_STATUS); - switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA)) { + switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_CONTROL)) { /* ATA PIO data transfer and control commands */ default: + /* on control commands read back registers to the request struct */ + if (request->flags & ATA_R_CONTROL) { + request->u.ata.count = ATA_IDX_INB(ch, ATA_COUNT); + request->u.ata.lba = ATA_IDX_INB(ch, ATA_SECTOR) | + (ATA_IDX_INB(ch, ATA_CYL_LSB) << 8) | + (ATA_IDX_INB(ch, ATA_CYL_MSB) << 16); + } + /* if we got an error we are done with the HW */ if (request->status & ATA_S_ERROR) { request->error = ATA_IDX_INB(ch, ATA_ERROR); break; } - /* if read data get it */ - if (request->flags & ATA_R_READ) - ata_pio_read(request, request->transfersize); - - /* update how far we've gotten */ - request->donecount += request->transfersize; - - /* do we need a scoop more ? */ - if (request->bytecount > request->donecount) { - - /* set this transfer size according to HW capabilities */ - request->transfersize = - min((request->bytecount - request->donecount), - request->transfersize); - - /* if data write command, output the data */ - if (request->flags & ATA_R_WRITE) { + /* are we moving data ? */ + if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { + + /* if read data get it */ + if (request->flags & ATA_R_READ) + ata_pio_read(request, request->transfersize); + + /* update how far we've gotten */ + request->donecount += request->transfersize; + + /* do we need a scoop more ? */ + if (request->bytecount > request->donecount) { + + /* set this transfer size according to HW capabilities */ + request->transfersize = + min((request->bytecount - request->donecount), + request->transfersize); + + /* if data write command, output the data */ + if (request->flags & ATA_R_WRITE) { + + /* if we get an error here we are done with the HW */ + if (ata_wait(request->device, + (ATA_S_READY | ATA_S_DSC | ATA_S_DRQ)) < 0) { + ata_prtdev(request->device, + "timeout waiting for write DRQ"); + request->status = ATA_IDX_INB(ch, ATA_STATUS); + break; + } - /* if we get an error here we are done with the HW */ - if (ata_wait(request->device, - (ATA_S_READY | ATA_S_DSC | ATA_S_DRQ)) < 0) { - ata_prtdev(request->device,"timeout waiting for write DRQ"); - request->status = ATA_IDX_INB(ch, ATA_STATUS); - break; + /* output data and return waiting for new interrupt */ + ata_pio_write(request, request->transfersize); + return; } - /* output data and return waiting for new interrupt */ - ata_pio_write(request, request->transfersize); - return; + /* if data read command, return & wait for interrupt */ + if (request->flags & ATA_R_READ) + return; } - - /* if data read command, return & wait for interrupt */ - else if (request->flags & ATA_R_READ) { - return; - } - else - ata_prtdev(request->device, - "FAILURE - %s shouldn't loop on control cmd\n", - ata_cmd2str(request)); } /* done with HW */ break; -- 2.45.2