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#include "ahci_defs.h"
9#include "scsi_cmds.h"
10
11class sata_request
12{
13public:
14					sata_request();
15					sata_request(scsi_ccb *ccb);
16					~sata_request();
17
18	void			set_data(void *data, size_t dataSize);
19
20	void			set_ata_cmd(uint8 command);
21	void			set_ata28_cmd(uint8 command, uint32 lba, uint8 sectorCount);
22	void			set_ata48_cmd(uint8 command, uint64 lba, uint16 sectorCount);
23
24	void			set_atapi_cmd(size_t transferLength);
25	bool 			is_atapi();
26	bool			is_test_unit_ready();
27
28	scsi_ccb *		ccb();
29	const void *	fis();
30	void *			data();
31	int				size();
32	void			finish(int tfd, size_t bytesTransfered);
33	void			abort();
34
35	void			wait_for_completition();
36	int				completition_status();
37
38private:
39	scsi_ccb *		fCcb;
40	uint8			fFis[20];
41	bool			fIsATAPI;
42	sem_id			fCompletionSem;
43	int				fCompletionStatus;
44	void *			fData;
45	size_t			fDataSize;
46};
47
48
49inline scsi_ccb *
50sata_request::ccb()
51{
52	return fCcb;
53}
54
55
56inline const void *
57sata_request::fis()
58{
59	return fFis;
60}
61
62
63inline bool
64sata_request::is_atapi()
65{
66	return fIsATAPI;
67}
68
69
70inline bool
71sata_request::is_test_unit_ready()
72{
73	return fIsATAPI && fCcb != NULL && fCcb->cdb[0] == SCSI_OP_TEST_UNIT_READY;
74}
75
76
77inline void *
78sata_request::data()
79{
80	return fData;
81}
82
83
84inline int
85sata_request::size()
86{
87	return fDataSize;
88}
89
90
91#endif
92