1/*
2 * Copyright 2008, Marcus Overhagen. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _SATA_REQUEST_H
6#define _SATA_REQUEST_H
7
8
9#include "ahci_defs.h"
10#include "scsi_cmds.h"
11
12
13class sata_request {
14public:
15								sata_request();
16								sata_request(scsi_ccb* ccb);
17								~sata_request();
18
19			void				SetData(void* data, size_t dataSize);
20
21			void				SetATACommand(uint8 command);
22			void				SetATA28Command(uint8 command, uint32 lba,
23									uint8 sectorCount);
24			void				SetATA48Command(uint8 command, uint64 lba,
25									uint16 sectorCount);
26			void				SetFeature(uint16 feature);
27
28			void				SetATAPICommand(size_t transferLength);
29			bool				IsATAPI();
30			bool				IsTestUnitReady();
31
32			scsi_ccb*			CCB();
33			const void*			FIS();
34			void*				Data();
35			int					Size();
36			void				Finish(int tfd, size_t bytesTransfered);
37			void				Abort();
38
39			void				WaitForCompletion();
40			int					CompletionStatus();
41
42private:
43			scsi_ccb*			fCcb;
44			uint8				fFis[20];
45			bool				fIsATAPI;
46			sem_id				fCompletionSem;
47			int					fCompletionStatus;
48			void*				fData;
49			size_t				fDataSize;
50};
51
52
53inline scsi_ccb*
54sata_request::CCB()
55{
56	return fCcb;
57}
58
59
60inline const void*
61sata_request::FIS()
62{
63	return fFis;
64}
65
66
67inline bool
68sata_request::IsATAPI()
69{
70	return fIsATAPI;
71}
72
73
74inline bool
75sata_request::IsTestUnitReady()
76{
77	return fIsATAPI && fCcb != NULL && fCcb->cdb[0] == SCSI_OP_TEST_UNIT_READY;
78}
79
80
81inline void*
82sata_request::Data()
83{
84	return fData;
85}
86
87
88inline int
89sata_request::Size()
90{
91	return fDataSize;
92}
93
94
95#endif	/* _SATA_REQUEST_H */
96