root/src/add-ons/kernel/busses/scsi/ahci/sata_request.h
/*
 * Copyright 2008, Marcus Overhagen. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _SATA_REQUEST_H
#define _SATA_REQUEST_H


#include "ahci_defs.h"
#include "scsi_cmds.h"


class sata_request {
public:
                                                                sata_request();
                                                                sata_request(scsi_ccb* ccb);
                                                                ~sata_request();

                        void                            SetData(void* data, size_t dataSize);

                        void                            SetATACommand(uint8 command);
                        void                            SetATA28Command(uint8 command, uint32 lba,
                                                                        uint8 sectorCount);
                        void                            SetATA48Command(uint8 command, uint64 lba,
                                                                        uint16 sectorCount);
                        void                            SetFeature(uint16 feature);

                        void                            SetATAPICommand(size_t transferLength);
                        bool                            IsATAPI();
                        bool                            IsTestUnitReady();

                        scsi_ccb*                       CCB();
                        const void*                     FIS();
                        void*                           Data();
                        int                                     Size();
                        void                            Finish(int tfd, size_t bytesTransfered);
                        void                            Abort();

                        void                            WaitForCompletion();
                        int                                     CompletionStatus();

private:
                        scsi_ccb*                       fCcb;
                        uint8                           fFis[20];
                        bool                            fIsATAPI;
                        sem_id                          fCompletionSem;
                        int                                     fCompletionStatus;
                        void*                           fData;
                        size_t                          fDataSize;
};


inline scsi_ccb*
sata_request::CCB()
{
        return fCcb;
}


inline const void*
sata_request::FIS()
{
        return fFis;
}


inline bool
sata_request::IsATAPI()
{
        return fIsATAPI;
}


inline bool
sata_request::IsTestUnitReady()
{
        return fIsATAPI && fCcb != NULL && fCcb->cdb[0] == SCSI_OP_TEST_UNIT_READY;
}


inline void*
sata_request::Data()
{
        return fData;
}


inline int
sata_request::Size()
{
        return fDataSize;
}


#endif  /* _SATA_REQUEST_H */