mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
rombios/ata Remove another needless trap from the int 0x13 hotpath
The return value from await_ide() is always ignored, and most calls to await_ide() immediately reread the status register. Therefore, making await_ide() return the last value of the status register removes a further two traps on the int 0x13 path. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Keir Fraser <keir@xen.org>
This commit is contained in:
1 parent
db46adf193
commit
01d8e90c60
1 file changed
+13
-19
@@ -2531,14 +2531,14 @@ void ata_init( )
|
||||
|
||||
#define IDE_TIMEOUT 32000u //32 seconds max for IDE ops
|
||||
|
||||
int await_ide();
|
||||
static int await_ide(when_done,base,timeout)
|
||||
Bit8u await_ide();
|
||||
static Bit8u await_ide(when_done,base,timeout)
|
||||
Bit8u when_done;
|
||||
Bit16u base;
|
||||
Bit16u timeout;
|
||||
{
|
||||
Bit32u time=0,last=0;
|
||||
Bit16u status;
|
||||
Bit8u status;
|
||||
Bit8u result;
|
||||
for(;;) {
|
||||
status = inb(base+ATA_CB_STAT);
|
||||
@@ -2556,7 +2556,7 @@ static int await_ide(when_done,base,timeout)
|
||||
else if (when_done == TIMEOUT)
|
||||
result = 0;
|
||||
|
||||
if (result) return 0;
|
||||
if (result) return status;
|
||||
if (time>>16 != last) // mod 2048 each 16 ms
|
||||
{
|
||||
last = time >>16;
|
||||
@@ -2565,12 +2565,12 @@ static int await_ide(when_done,base,timeout)
|
||||
if (status & ATA_CB_STAT_ERR)
|
||||
{
|
||||
BX_DEBUG_ATA("await_ide: ERROR (TIMEOUT,BSY,!BSY,!BSY_DRQ,!BSY_!DRQ,!BSY_RDY) %d time= %ld timeout= %d\n",when_done,time>>11, timeout);
|
||||
return -1;
|
||||
return status;
|
||||
}
|
||||
if ((timeout == 0) || ((time>>11) > timeout)) break;
|
||||
}
|
||||
BX_INFO("IDE time out\n");
|
||||
return -1;
|
||||
return status;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -3016,8 +3016,7 @@ Bit32u lba_low, lba_high;
|
||||
outb(iobase1 + ATA_CB_DH, (slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0) | (Bit8u) head );
|
||||
outb(iobase1 + ATA_CB_CMD, command);
|
||||
|
||||
await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
status = inb(iobase1 + ATA_CB_STAT);
|
||||
status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
|
||||
if (status & ATA_CB_STAT_ERR) {
|
||||
BX_DEBUG_ATA("ata_cmd_data_in : read error\n");
|
||||
@@ -3077,8 +3076,7 @@ ASM_END
|
||||
current++;
|
||||
write_word(ebda_seg, &EbdaData->ata.trsfsectors,current);
|
||||
count--;
|
||||
await_ide(NOT_BSY, iobase1, IDE_TIMEOUT);
|
||||
status = inb(iobase1 + ATA_CB_STAT);
|
||||
status = await_ide(NOT_BSY, iobase1, IDE_TIMEOUT);
|
||||
if (count == 0) {
|
||||
if ( (status & (ATA_CB_STAT_BSY | ATA_CB_STAT_RDY | ATA_CB_STAT_DRQ | ATA_CB_STAT_ERR) )
|
||||
!= ATA_CB_STAT_RDY ) {
|
||||
@@ -3167,8 +3165,7 @@ Bit32u lba_low, lba_high;
|
||||
outb(iobase1 + ATA_CB_DH, (slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0) | (Bit8u) head );
|
||||
outb(iobase1 + ATA_CB_CMD, command);
|
||||
|
||||
await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
status = inb(iobase1 + ATA_CB_STAT);
|
||||
status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
|
||||
if (status & ATA_CB_STAT_ERR) {
|
||||
BX_DEBUG_ATA("ata_cmd_data_out : read error\n");
|
||||
@@ -3316,8 +3313,7 @@ Bit32u length;
|
||||
outb(iobase1 + ATA_CB_CMD, ATA_CMD_PACKET);
|
||||
|
||||
// Device should ok to receive command
|
||||
await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
status = inb(iobase1 + ATA_CB_STAT);
|
||||
status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
|
||||
if (status & ATA_CB_STAT_ERR) {
|
||||
BX_DEBUG_ATA("ata_cmd_packet : error, status is %02x\n",status);
|
||||
@@ -3353,8 +3349,7 @@ ASM_START
|
||||
ASM_END
|
||||
|
||||
if (inout == ATA_DATA_NO) {
|
||||
await_ide(NOT_BSY, iobase1, IDE_TIMEOUT);
|
||||
status = inb(iobase1 + ATA_CB_STAT);
|
||||
status = await_ide(NOT_BSY, iobase1, IDE_TIMEOUT);
|
||||
}
|
||||
else {
|
||||
Bit16u loops = 0;
|
||||
@@ -3363,13 +3358,12 @@ ASM_END
|
||||
|
||||
if (loops == 0) {//first time through
|
||||
status = inb(iobase2 + ATA_CB_ASTAT);
|
||||
await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
status = await_ide(NOT_BSY_DRQ, iobase1, IDE_TIMEOUT);
|
||||
}
|
||||
else
|
||||
await_ide(NOT_BSY, iobase1, IDE_TIMEOUT);
|
||||
status = await_ide(NOT_BSY, iobase1, IDE_TIMEOUT);
|
||||
loops++;
|
||||
|
||||
status = inb(iobase1 + ATA_CB_STAT);
|
||||
sc = inb(iobase1 + ATA_CB_SC);
|
||||
|
||||
// Check if command completed
|
||||
|
||||