VirtualBox

Changeset 35767 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jan 28, 2011 2:41:06 PM (14 years ago)
Author:
vboxsync
Message:

Storage/DevATA: fix device reset handling, sanity check was wrong

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevATA.cpp

    r35595 r35767  
    49974997
    49984998            case ATA_AIO_ABORT:
    4999                 /* Abort the current command only if it operates on the same interface. */
    5000                 if (pCtl->iAIOIf == pReq->u.a.iIf)
     4999                /* Abort the current command no matter what. There cannot be
     5000                 * any command activity on the other drive otherwise using
     5001                 * one thread per controller wouldn't work at all. */
     5002                s = &pCtl->aIfs[pReq->u.a.iIf];
     5003
     5004                pCtl->uAsyncIOState = ATA_AIO_NEW;
     5005                /* Do not change the DMA registers, they are not affected by the
     5006                 * ATA controller reset logic. It should be sufficient to issue a
     5007                 * new command, which is now possible as the state is cleared. */
     5008                if (pReq->u.a.fResetDrive)
    50015009                {
    5002                     s = &pCtl->aIfs[pCtl->iAIOIf];
    5003 
    5004                     pCtl->uAsyncIOState = ATA_AIO_NEW;
    5005                     /* Do not change the DMA registers, they are not affected by the
    5006                      * ATA controller reset logic. It should be sufficient to issue a
    5007                      * new command, which is now possible as the state is cleared. */
    5008                     if (pReq->u.a.fResetDrive)
    5009                     {
    5010                         ataResetDevice(s);
    5011                         ataExecuteDeviceDiagnosticSS(s);
    5012                     }
    5013                     else
    5014                     {
    5015                         /* Stop any pending DMA transfer. */
    5016                         s->fDMA = false;
    5017                         ataPIOTransferStop(s);
    5018                         ataUnsetStatus(s, ATA_STAT_BUSY | ATA_STAT_DRQ | ATA_STAT_SEEK | ATA_STAT_ERR);
    5019                         ataSetStatus(s, ATA_STAT_READY);
    5020                         ataSetIRQ(s);
    5021                     }
     5010                    ataResetDevice(s);
     5011                    ataExecuteDeviceDiagnosticSS(s);
     5012                }
     5013                else
     5014                {
     5015                    /* Stop any pending DMA transfer. */
     5016                    s->fDMA = false;
     5017                    ataPIOTransferStop(s);
     5018                    ataUnsetStatus(s, ATA_STAT_BUSY | ATA_STAT_DRQ | ATA_STAT_SEEK | ATA_STAT_ERR);
     5019                    ataSetStatus(s, ATA_STAT_READY);
     5020                    ataSetIRQ(s);
    50225021                }
    50235022                break;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette