[freedos-32-commit] drivers/ata/src ata-ops.c,1.10,1.11
Status: Pre-Alpha
Brought to you by:
salvois
From: Nils L. <nl...@us...> - 2005-04-25 19:23:39
|
Update of /cvsroot/freedos-32/drivers/ata/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23781/src Modified Files: ata-ops.c Log Message: Implementing "device reset" and using it instead of "software reset" if possible. Index: ata-ops.c =================================================================== RCS file: /cvsroot/freedos-32/drivers/ata/src/ata-ops.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- ata-ops.c 25 Apr 2005 13:03:24 -0000 1.10 +++ ata-ops.c 25 Apr 2005 19:23:30 -0000 1.11 @@ -535,6 +535,38 @@ return 0; } +int ata_dev_reset( struct ata_device* dev) +{ + int res; + BYTE status; + + if(dev->interface->current_dev_bit != dev->dev_bit) + { + /* Is this correct? Should we wait for the other device? */ + if(bsy_drq_is_set(dev->interface)) + { + res = ata_poll(MAX_WAIT_1, &bsy_drq_is_set, dev->interface); + if(res) + { + status = fd32_inb(dev->interface->command_port + CMD_STATUS); + if(status & ATA_STATUS_DRQ) + { + return ATA_DRQ_SET; + } + return ATA_ETOBUSY; + } + } + fd32_outb(dev->interface->command_port + CMD_DEVHEAD, dev->dev_bit); + dev->interface->current_dev_bit = dev->dev_bit; + } + fd32_outb(dev->interface->command_port + CMD_COMMAND, ATA_CMD_DEVICE_RESET); + /* The device is not supposed to revert to defaults after this command, so we just return */ + /* without reinitializing */ + /* FIXME: proper timeout */ + /* TODO: check (return?) diagnostics results */ + return command_ackn(dev); +} + int ata_check_standby( struct ata_device* dev) { int res; |