xref: /freebsd/sys/dev/hpt27xx/him.h (revision 81966bce06dac45f42bda62b14dba0756ef28505)
1*81966bceSXin LI /*-
2*81966bceSXin LI  * Copyright (c) 2011 HighPoint Technologies, Inc.
3*81966bceSXin LI  * All rights reserved.
4*81966bceSXin LI  *
5*81966bceSXin LI  * Redistribution and use in source and binary forms, with or without
6*81966bceSXin LI  * modification, are permitted provided that the following conditions
7*81966bceSXin LI  * are met:
8*81966bceSXin LI  * 1. Redistributions of source code must retain the above copyright
9*81966bceSXin LI  *    notice, this list of conditions and the following disclaimer.
10*81966bceSXin LI  * 2. Redistributions in binary form must reproduce the above copyright
11*81966bceSXin LI  *    notice, this list of conditions and the following disclaimer in the
12*81966bceSXin LI  *    documentation and/or other materials provided with the distribution.
13*81966bceSXin LI  *
14*81966bceSXin LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*81966bceSXin LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*81966bceSXin LI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*81966bceSXin LI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*81966bceSXin LI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*81966bceSXin LI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*81966bceSXin LI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*81966bceSXin LI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*81966bceSXin LI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*81966bceSXin LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*81966bceSXin LI  * SUCH DAMAGE.
25*81966bceSXin LI  *
26*81966bceSXin LI  * $FreeBSD$
27*81966bceSXin LI  */
28*81966bceSXin LI 
29*81966bceSXin LI #include <dev/hpt27xx/hpt27xx_config.h>
30*81966bceSXin LI 
31*81966bceSXin LI #ifndef _HPT_HIM_H_
32*81966bceSXin LI #define _HPT_HIM_H_
33*81966bceSXin LI 
34*81966bceSXin LI #define VERMAGIC_HIM 55
35*81966bceSXin LI 
36*81966bceSXin LI #if defined(__cplusplus)
37*81966bceSXin LI extern "C" {
38*81966bceSXin LI #endif
39*81966bceSXin LI 
40*81966bceSXin LI #include <dev/hpt27xx/list.h>
41*81966bceSXin LI 
42*81966bceSXin LI #define SECTOR_TO_BYTE_SHIFT 9
43*81966bceSXin LI #define SECTOR_TO_BYTE(x)       ((HPT_U32)(x) << SECTOR_TO_BYTE_SHIFT)
44*81966bceSXin LI #define BYTE_TO_SECTOR(x)       ((x)>>SECTOR_TO_BYTE_SHIFT)
45*81966bceSXin LI 
46*81966bceSXin LI typedef struct _PCI_ID
47*81966bceSXin LI {
48*81966bceSXin LI 	HPT_U16 vid;
49*81966bceSXin LI 	HPT_U16 did;
50*81966bceSXin LI 	HPT_U32 subsys;
51*81966bceSXin LI 	HPT_U8  rev;
52*81966bceSXin LI 	HPT_U8  nbase;
53*81966bceSXin LI 	HPT_U16 reserve;
54*81966bceSXin LI }
55*81966bceSXin LI PCI_ID;
56*81966bceSXin LI 
57*81966bceSXin LI typedef struct _PCI_ADDRESS
58*81966bceSXin LI {
59*81966bceSXin LI 	HPT_U8 tree;
60*81966bceSXin LI 	HPT_U8 bus;
61*81966bceSXin LI 	HPT_U8 device;
62*81966bceSXin LI 	HPT_U8 function;
63*81966bceSXin LI }
64*81966bceSXin LI PCI_ADDRESS;
65*81966bceSXin LI 
66*81966bceSXin LI typedef struct _HIM_ADAPTER_CONFIG
67*81966bceSXin LI {
68*81966bceSXin LI 	PCI_ADDRESS pci_addr;
69*81966bceSXin LI 	PCI_ID  pci_id;
70*81966bceSXin LI 
71*81966bceSXin LI 	HPT_U8  max_devices;
72*81966bceSXin LI 
73*81966bceSXin LI 	HPT_U8  bProbeInInitializing:1;
74*81966bceSXin LI 
75*81966bceSXin LI 	HPT_U8  bSpinupOneDevEachTime:1;
76*81966bceSXin LI 
77*81966bceSXin LI 	HPT_U8  bGlobalNcq:1;
78*81966bceSXin LI 	HPT_U8  bSGPIOPartSupport:1;
79*81966bceSXin LI 
80*81966bceSXin LI 	HPT_U8  bNeedSASIdleTimer:1;
81*81966bceSXin LI 	HPT_U8  reserved:3;
82*81966bceSXin LI 
83*81966bceSXin LI 	HPT_U8  bDevsPerBus;
84*81966bceSXin LI 	HPT_U8  first_on_slot;
85*81966bceSXin LI 
86*81966bceSXin LI 	HPT_U8  bChipType;
87*81966bceSXin LI 	HPT_U8  bChipIntrNum;
88*81966bceSXin LI 	HPT_U8  bChipFlags;
89*81966bceSXin LI 	HPT_U8  bNumBuses;
90*81966bceSXin LI 
91*81966bceSXin LI 	HPT_U8  szVendorID[36];
92*81966bceSXin LI 	HPT_U8  szProductID[36];
93*81966bceSXin LI 	HPT_U32 nvramSize;
94*81966bceSXin LI 	HPT_U64 nvramAddress;
95*81966bceSXin LI 	HPT_U8  slot_index;
96*81966bceSXin LI 	HPT_U8  reserved2[11];
97*81966bceSXin LI }
98*81966bceSXin LI HIM_ADAPTER_CONFIG, *PHIM_ADAPTER_CONFIG;
99*81966bceSXin LI 
100*81966bceSXin LI typedef struct _HIM_CHANNEL_CONFIG
101*81966bceSXin LI {
102*81966bceSXin LI 	HPT_U32 io_port;
103*81966bceSXin LI 	HPT_U32 ctl_port;
104*81966bceSXin LI } HIM_CHANNEL_CONFIG, *PHIM_CHANNEL_CONFIG;
105*81966bceSXin LI 
106*81966bceSXin LI typedef struct _HIM_DEVICE_FLAGS
107*81966bceSXin LI {
108*81966bceSXin LI 	HPT_UINT df_atapi               :1;
109*81966bceSXin LI 	HPT_UINT df_removable_drive     :1;
110*81966bceSXin LI 	HPT_UINT df_on_line             :1;
111*81966bceSXin LI 	HPT_UINT df_reduce_mode         :1;
112*81966bceSXin LI 	HPT_UINT df_sata                :1;
113*81966bceSXin LI 	HPT_UINT df_on_pm_port          :1;
114*81966bceSXin LI 	HPT_UINT df_support_read_ahead  :1;
115*81966bceSXin LI 	HPT_UINT df_read_ahead_enabled  :1;
116*81966bceSXin LI 	HPT_UINT df_support_write_cache :1;
117*81966bceSXin LI 	HPT_UINT df_write_cache_enabled :1;
118*81966bceSXin LI 	HPT_UINT df_cdrom_device        :1;
119*81966bceSXin LI 	HPT_UINT df_tape_device         :1;
120*81966bceSXin LI 	HPT_UINT df_support_tcq         :1;
121*81966bceSXin LI 	HPT_UINT df_tcq_enabled         :1;
122*81966bceSXin LI 	HPT_UINT df_support_ncq         :1;
123*81966bceSXin LI 	HPT_UINT df_ncq_enabled         :1;
124*81966bceSXin LI 	HPT_UINT df_sas                 :1;
125*81966bceSXin LI 	HPT_UINT df_in_enclosure        :1;
126*81966bceSXin LI 	HPT_UINT df_ssd                 :1;
127*81966bceSXin LI } DEVICE_FLAGS, *PDEVICE_FLAGS;
128*81966bceSXin LI 
129*81966bceSXin LI #pragma pack(1)
130*81966bceSXin LI typedef struct _IDENTIFY_DATA {
131*81966bceSXin LI 	HPT_U16 GeneralConfiguration;
132*81966bceSXin LI 	HPT_U16 NumberOfCylinders;
133*81966bceSXin LI 	HPT_U16 Reserved1;
134*81966bceSXin LI 	HPT_U16 NumberOfHeads;
135*81966bceSXin LI 	HPT_U16 UnformattedBytesPerTrack;
136*81966bceSXin LI 	HPT_U16 UnformattedBytesPerSector;
137*81966bceSXin LI 	HPT_U8  SasAddress[8];
138*81966bceSXin LI 	HPT_U16 SerialNumber[10];
139*81966bceSXin LI 	HPT_U16 BufferType;
140*81966bceSXin LI 	HPT_U16 BufferSectorSize;
141*81966bceSXin LI 	HPT_U16 NumberOfEccBytes;
142*81966bceSXin LI 	HPT_U16 FirmwareRevision[4];
143*81966bceSXin LI 	HPT_U16 ModelNumber[20];
144*81966bceSXin LI 	HPT_U8  MaximumBlockTransfer;
145*81966bceSXin LI 	HPT_U8  VendorUnique2;
146*81966bceSXin LI 	HPT_U16 DoubleWordIo;
147*81966bceSXin LI 	HPT_U16 Capabilities;
148*81966bceSXin LI 	HPT_U16 Reserved2;
149*81966bceSXin LI 	HPT_U8  VendorUnique3;
150*81966bceSXin LI 	HPT_U8  PioCycleTimingMode;
151*81966bceSXin LI 	HPT_U8  VendorUnique4;
152*81966bceSXin LI 	HPT_U8  DmaCycleTimingMode;
153*81966bceSXin LI 	HPT_U16 TranslationFieldsValid;
154*81966bceSXin LI 	HPT_U16 NumberOfCurrentCylinders;
155*81966bceSXin LI 	HPT_U16 NumberOfCurrentHeads;
156*81966bceSXin LI 	HPT_U16 CurrentSectorsPerTrack;
157*81966bceSXin LI 	HPT_U32 CurrentSectorCapacity;
158*81966bceSXin LI 	HPT_U16 CurrentMultiSectorSetting;
159*81966bceSXin LI 	HPT_U32 UserAddressableSectors;
160*81966bceSXin LI 	HPT_U8  SingleWordDMASupport;
161*81966bceSXin LI 	HPT_U8  SingleWordDMAActive;
162*81966bceSXin LI 	HPT_U8  MultiWordDMASupport;
163*81966bceSXin LI 	HPT_U8  MultiWordDMAActive;
164*81966bceSXin LI 	HPT_U8  AdvancedPIOModes;
165*81966bceSXin LI 	HPT_U8  Reserved4;
166*81966bceSXin LI 	HPT_U16 MinimumMWXferCycleTime;
167*81966bceSXin LI 	HPT_U16 RecommendedMWXferCycleTime;
168*81966bceSXin LI 	HPT_U16 MinimumPIOCycleTime;
169*81966bceSXin LI 	HPT_U16 MinimumPIOCycleTimeIORDY;
170*81966bceSXin LI 	HPT_U16 Reserved5[2];
171*81966bceSXin LI 	HPT_U16 ReleaseTimeOverlapped;
172*81966bceSXin LI 	HPT_U16 ReleaseTimeServiceCommand;
173*81966bceSXin LI 	HPT_U16 MajorRevision;
174*81966bceSXin LI 	HPT_U16 MinorRevision;
175*81966bceSXin LI 	HPT_U16 MaxQueueDepth;
176*81966bceSXin LI 	HPT_U16 SataCapability;
177*81966bceSXin LI 	HPT_U16 Reserved6[9];
178*81966bceSXin LI 	HPT_U16 CommandSupport;
179*81966bceSXin LI 	HPT_U16 CommandEnable;
180*81966bceSXin LI 	HPT_U16 UtralDmaMode;
181*81966bceSXin LI 	HPT_U16 Reserved7[11];
182*81966bceSXin LI 	HPT_U32 Lba48BitLow;
183*81966bceSXin LI 	HPT_U32 Lba48BitHigh;
184*81966bceSXin LI 	HPT_U16 Reserved8[23];
185*81966bceSXin LI 	HPT_U16 SpecialFunctionsEnabled;
186*81966bceSXin LI 	HPT_U16 Reserved9[128];
187*81966bceSXin LI }
188*81966bceSXin LI #ifdef __GNUC__
189*81966bceSXin LI __attribute__((packed))
190*81966bceSXin LI #endif
191*81966bceSXin LI IDENTIFY_DATA, *PIDENTIFY_DATA;
192*81966bceSXin LI #pragma pack()
193*81966bceSXin LI 
194*81966bceSXin LI typedef struct _HIM_DEVICE_CONFIG
195*81966bceSXin LI {
196*81966bceSXin LI 	HPT_U64 capacity;
197*81966bceSXin LI 
198*81966bceSXin LI 	DEVICE_FLAGS flags;
199*81966bceSXin LI 
200*81966bceSXin LI 	HPT_U8  path_id;
201*81966bceSXin LI 	HPT_U8  target_id;
202*81966bceSXin LI 	HPT_U8  max_queue_depth;
203*81966bceSXin LI 	HPT_U8  spin_up_mode;
204*81966bceSXin LI 
205*81966bceSXin LI 	HPT_U8  reserved;
206*81966bceSXin LI 	HPT_U8  transfer_mode;
207*81966bceSXin LI 	HPT_U8  bMaxShowMode;
208*81966bceSXin LI 	HPT_U8  bDeUsable_Mode;
209*81966bceSXin LI 
210*81966bceSXin LI 	HPT_U16 max_sectors_per_cmd;
211*81966bceSXin LI 
212*81966bceSXin LI 	PIDENTIFY_DATA pIdentifyData;
213*81966bceSXin LI 
214*81966bceSXin LI 
215*81966bceSXin LI 	HPT_U8  fixed_path_id; /*equals to phy id */
216*81966bceSXin LI }
217*81966bceSXin LI HIM_DEVICE_CONFIG, *PHIM_DEVICE_CONFIG;
218*81966bceSXin LI 
219*81966bceSXin LI 
220*81966bceSXin LI #define _DIT_MODE               0
221*81966bceSXin LI #define _DIT_601                1
222*81966bceSXin LI #define _DIT_READ_AHEAD         2
223*81966bceSXin LI #define _DIT_WRITE_CACHE        3
224*81966bceSXin LI #define _DIT_TCQ                4
225*81966bceSXin LI #define _DIT_NCQ                5
226*81966bceSXin LI #define _DIT_BEEP_OFF           6
227*81966bceSXin LI #define _DIT_SPIN_UP_MODE       7
228*81966bceSXin LI #define _DIT_IDLE_STANDBY       8
229*81966bceSXin LI #define _DIT_IDENTIFY           9
230*81966bceSXin LI 
231*81966bceSXin LI #define SPIN_UP_MODE_NOSUPPORT 0
232*81966bceSXin LI #define SPIN_UP_MODE_FULL      1
233*81966bceSXin LI #define SPIN_UP_MODE_STANDBY   2
234*81966bceSXin LI 
235*81966bceSXin LI struct tcq_control {
236*81966bceSXin LI 	HPT_U8 enable;
237*81966bceSXin LI 	HPT_U8 depth;
238*81966bceSXin LI };
239*81966bceSXin LI 
240*81966bceSXin LI struct ncq_control {
241*81966bceSXin LI 	HPT_U8 enable;
242*81966bceSXin LI 	HPT_U8 depth;
243*81966bceSXin LI };
244*81966bceSXin LI 
245*81966bceSXin LI typedef struct _HIM_ALTERABLE_DEV_INFO{
246*81966bceSXin LI 	HPT_U8 type;
247*81966bceSXin LI 	union {
248*81966bceSXin LI 		HPT_U8 mode;
249*81966bceSXin LI 		HPT_U8 enable_read_ahead;
250*81966bceSXin LI 		HPT_U8 enable_read_cache;
251*81966bceSXin LI 		HPT_U8 enable_write_cache;
252*81966bceSXin LI 		struct tcq_control tcq;
253*81966bceSXin LI 		struct ncq_control ncq;
254*81966bceSXin LI 		void * adapter;
255*81966bceSXin LI 		HPT_U8 spin_up_mode;
256*81966bceSXin LI 		HPT_U8 idle_standby_timeout;
257*81966bceSXin LI 		HPT_U8 identify_indicator;
258*81966bceSXin LI 	}u;
259*81966bceSXin LI } HIM_ALTERABLE_DEV_INFO, *PHIM_ALTERABLE_DEV_INFO;
260*81966bceSXin LI 
261*81966bceSXin LI struct _COMMAND;
262*81966bceSXin LI struct _IOCTL_ARG;
263*81966bceSXin LI 
264*81966bceSXin LI typedef void (*PROBE_CALLBACK)(void *arg, void *dev, int index);
265*81966bceSXin LI 
266*81966bceSXin LI typedef struct _HIM {
267*81966bceSXin LI 	char *name;
268*81966bceSXin LI 	struct _HIM *next;
269*81966bceSXin LI 	HPT_UINT max_sg_descriptors;
270*81966bceSXin LI 	#define _HIM_INTERFACE(_type, _fn, _args) _type (* _fn) _args;
271*81966bceSXin LI 	#include <dev/hpt27xx/himfuncs.h>
272*81966bceSXin LI }
273*81966bceSXin LI HIM, *PHIM;
274*81966bceSXin LI 
275*81966bceSXin LI 
276*81966bceSXin LI #pragma pack(1)
277*81966bceSXin LI #ifdef SG_FLAG_EOT
278*81966bceSXin LI #error "don't use SG_FLAG_EOT with _SG.eot. clean the code!"
279*81966bceSXin LI #endif
280*81966bceSXin LI 
281*81966bceSXin LI typedef struct _SG {
282*81966bceSXin LI 	HPT_U32 size;
283*81966bceSXin LI 	HPT_UINT eot;
284*81966bceSXin LI 	union {
285*81966bceSXin LI 		HPT_U8 FAR * _logical;
286*81966bceSXin LI 		BUS_ADDRESS bus;
287*81966bceSXin LI 	}
288*81966bceSXin LI 	addr;
289*81966bceSXin LI }
290*81966bceSXin LI SG, *PSG;
291*81966bceSXin LI #pragma pack()
292*81966bceSXin LI 
293*81966bceSXin LI typedef struct _AtaCommand
294*81966bceSXin LI {
295*81966bceSXin LI     HPT_U64     Lba;
296*81966bceSXin LI     HPT_U16     nSectors;
297*81966bceSXin LI     HPT_U16     pad;
298*81966bceSXin LI } AtaComm, *PAtaComm;
299*81966bceSXin LI 
300*81966bceSXin LI #define ATA_CMD_NOP          0x0
301*81966bceSXin LI 
302*81966bceSXin LI #define ATA_CMD_SET_FEATURES    0xef
303*81966bceSXin LI #define ATA_CMD_FLUSH           0xE7
304*81966bceSXin LI #define ATA_CMD_VERIFY          0x40
305*81966bceSXin LI #define ATA_CMD_STANDBY         0xe2
306*81966bceSXin LI #define ATA_CMD_READ_MULTI      0xC4
307*81966bceSXin LI #define ATA_CMD_READ_MULTI_EXT  0x29
308*81966bceSXin LI #define ATA_CMD_WRITE_MULTI     0xC5
309*81966bceSXin LI #define ATA_CMD_WRITE_MULTI_EXT 0x39
310*81966bceSXin LI #define ATA_CMD_WRITE_MULTI_FUA_EXT     0xCE
311*81966bceSXin LI 
312*81966bceSXin LI #define ATA_CMD_READ_DMA        0xc8  /* IDE DMA read command           */
313*81966bceSXin LI #define ATA_CMD_WRITE_DMA       0xca  /* IDE DMA write command          */
314*81966bceSXin LI #define ATA_CMD_READ_DMA_EXT        0x25
315*81966bceSXin LI #define ATA_CMD_READ_QUEUE_EXT      0x26
316*81966bceSXin LI #define ATA_CMD_READ_MAX_ADDR       0x27
317*81966bceSXin LI #define ATA_CMD_READ_EXT            0x24
318*81966bceSXin LI #define ATA_CMD_VERIFY_EXT          0x42
319*81966bceSXin LI #define ATA_CMD_WRITE_DMA_EXT       0x35
320*81966bceSXin LI #define ATA_CMD_WRITE_QUEUE_EXT     0x36
321*81966bceSXin LI #define ATA_CMD_WRITE_EXT           0x34
322*81966bceSXin LI 
323*81966bceSXin LI #define ATA_SET_FEATURES_XFER 0x3
324*81966bceSXin LI #define ATA_SECTOR_SIZE 512
325*81966bceSXin LI 
326*81966bceSXin LI typedef struct _PassthroughCmd {
327*81966bceSXin LI 	HPT_U16    bFeaturesReg;
328*81966bceSXin LI 	HPT_U16    bSectorCountReg;
329*81966bceSXin LI 	HPT_U16    bLbaLowReg;
330*81966bceSXin LI 	HPT_U16    bLbaMidReg;
331*81966bceSXin LI 	HPT_U16    bLbaHighReg;
332*81966bceSXin LI 	HPT_U8     bDriveHeadReg;
333*81966bceSXin LI 	HPT_U8     bCommandReg;
334*81966bceSXin LI 	HPT_U16    nSectors;
335*81966bceSXin LI 	HPT_U8    *pDataBuffer;
336*81966bceSXin LI }
337*81966bceSXin LI PassthroughCmd;
338*81966bceSXin LI 
339*81966bceSXin LI typedef struct _ScsiComm {
340*81966bceSXin LI 	HPT_U8  cdbLength;
341*81966bceSXin LI 	HPT_U8  senseLength;
342*81966bceSXin LI 	HPT_U8  scsiStatus;
343*81966bceSXin LI 	HPT_U8  reserve1;
344*81966bceSXin LI 	HPT_U32 dataLength;
345*81966bceSXin LI 	HPT_U8 *cdb;
346*81966bceSXin LI 	HPT_U8 *senseBuffer;
347*81966bceSXin LI }
348*81966bceSXin LI ScsiComm;
349*81966bceSXin LI 
350*81966bceSXin LI 
351*81966bceSXin LI #define CTRL_CMD_REBUILD 1
352*81966bceSXin LI #define CTRL_CMD_VERIFY  2
353*81966bceSXin LI #define CTRL_CMD_INIT    3
354*81966bceSXin LI 
355*81966bceSXin LI 
356*81966bceSXin LI typedef struct _R5ControlCmd {
357*81966bceSXin LI 	HPT_U64  StripeLine;
358*81966bceSXin LI 	HPT_U16 Offset;
359*81966bceSXin LI 	HPT_U8  Command;
360*81966bceSXin LI 	HPT_U8  reserve1;
361*81966bceSXin LI }
362*81966bceSXin LI R5ControlCmd, *PR5ControlCmd;
363*81966bceSXin LI 
364*81966bceSXin LI typedef struct _HPT_ADDRESS
365*81966bceSXin LI {
366*81966bceSXin LI 	HPT_U8 * logical;
367*81966bceSXin LI 	BUS_ADDRESS bus;
368*81966bceSXin LI }
369*81966bceSXin LI HPT_ADDRESS;
370*81966bceSXin LI 
371*81966bceSXin LI 
372*81966bceSXin LI typedef struct ctl_pages {
373*81966bceSXin LI 	HPT_ADDRESS *pages;
374*81966bceSXin LI 	HPT_UINT        page_size;
375*81966bceSXin LI 	HPT_UINT        npages;
376*81966bceSXin LI 	HPT_UINT min_sg_descriptors;
377*81966bceSXin LI } CONTROL_PAGES, *PCONTROL_PAGES;
378*81966bceSXin LI 
379*81966bceSXin LI typedef struct _R1ControlCmd {
380*81966bceSXin LI 	HPT_U64  Lba;
381*81966bceSXin LI 	HPT_U16 nSectors;
382*81966bceSXin LI 	HPT_U8  Command;      /* CTRL_CMD_XXX */
383*81966bceSXin LI 	HPT_U8  reserve1;
384*81966bceSXin LI 	PCONTROL_PAGES ctl_pages;
385*81966bceSXin LI }
386*81966bceSXin LI R1ControlCmd, *PR1ControlCmd;
387*81966bceSXin LI 
388*81966bceSXin LI typedef void (*TQ_PROC)(void *arg);
389*81966bceSXin LI 
390*81966bceSXin LI struct tq_item {
391*81966bceSXin LI 	TQ_PROC proc;
392*81966bceSXin LI 	void *arg;
393*81966bceSXin LI 	struct tq_item *next;
394*81966bceSXin LI };
395*81966bceSXin LI 
396*81966bceSXin LI #define INIT_TQ_ITEM(t, p, a) \
397*81966bceSXin LI 	do { (t)->proc = p; (t)->arg = a; (t)->next = 0; } while (0)
398*81966bceSXin LI 
399*81966bceSXin LI typedef struct _COMMAND
400*81966bceSXin LI {
401*81966bceSXin LI 
402*81966bceSXin LI 	struct _VBUS * vbus;
403*81966bceSXin LI 
404*81966bceSXin LI 	struct freelist *grplist;
405*81966bceSXin LI 	HPT_UINT grpcnt;
406*81966bceSXin LI 
407*81966bceSXin LI 
408*81966bceSXin LI 	struct list_head q_link;
409*81966bceSXin LI 	struct tq_item done_dpc;
410*81966bceSXin LI 
411*81966bceSXin LI 	HPT_UINT extsize;
412*81966bceSXin LI 	void *ext;
413*81966bceSXin LI 
414*81966bceSXin LI 
415*81966bceSXin LI 
416*81966bceSXin LI 	void *target;
417*81966bceSXin LI 	void *priv;
418*81966bceSXin LI 	HPT_UPTR priv2;
419*81966bceSXin LI 
420*81966bceSXin LI 	int priority;
421*81966bceSXin LI 	struct lock_request *owned_lock;
422*81966bceSXin LI 	struct lock_request *lock_req;
423*81966bceSXin LI 	void (*dtor)(struct _COMMAND *, void *);
424*81966bceSXin LI 	void *dtor_arg;
425*81966bceSXin LI 
426*81966bceSXin LI 	union{
427*81966bceSXin LI 		AtaComm Ide;
428*81966bceSXin LI 		PassthroughCmd Passthrough;
429*81966bceSXin LI 		ScsiComm Scsi;
430*81966bceSXin LI 		R5ControlCmd R5Control;
431*81966bceSXin LI 		R1ControlCmd R1Control;
432*81966bceSXin LI 	} uCmd;
433*81966bceSXin LI 
434*81966bceSXin LI 	HPT_U8 type; /* CMD_TYPE_* */
435*81966bceSXin LI 
436*81966bceSXin LI 	struct {
437*81966bceSXin LI 		HPT_U8  physical_sg: 1;
438*81966bceSXin LI 		HPT_U8  data_in: 1;
439*81966bceSXin LI 		HPT_U8  data_out: 1;
440*81966bceSXin LI 		HPT_U8  transform : 1;
441*81966bceSXin LI 		HPT_U8  hard_flush: 2;
442*81966bceSXin LI 		HPT_U8  from_cc: 1;
443*81966bceSXin LI 		HPT_U8  force_cc: 1;
444*81966bceSXin LI 	} flags;
445*81966bceSXin LI 
446*81966bceSXin LI 	/* return status */
447*81966bceSXin LI 	HPT_U8  Result;
448*81966bceSXin LI 	/* retry count */
449*81966bceSXin LI 	HPT_U8  RetryCount;
450*81966bceSXin LI 
451*81966bceSXin LI 
452*81966bceSXin LI 	PSG psg;
453*81966bceSXin LI 
454*81966bceSXin LI 
455*81966bceSXin LI 	int  (*buildsgl)(struct _COMMAND *cmd, PSG psg, int logical);
456*81966bceSXin LI 	void (*done)(struct _COMMAND *cmd);
457*81966bceSXin LI }
458*81966bceSXin LI COMMAND, *PCOMMAND;
459*81966bceSXin LI 
460*81966bceSXin LI /* command types */
461*81966bceSXin LI #define   CMD_TYPE_IO           0
462*81966bceSXin LI #define   CMD_TYPE_CONTROL      1
463*81966bceSXin LI #define   CMD_TYPE_ATAPI        2
464*81966bceSXin LI #define   CMD_TYPE_SCSI         CMD_TYPE_ATAPI
465*81966bceSXin LI #define   CMD_TYPE_PASSTHROUGH  3
466*81966bceSXin LI #define   CMD_TYPE_FLUSH        4
467*81966bceSXin LI #define   CMD_TYPE_IO_INDIRECT  0x80
468*81966bceSXin LI 
469*81966bceSXin LI /* flush command flags */
470*81966bceSXin LI #define   CF_HARD_FLUSH_CACHE   1
471*81966bceSXin LI #define   CF_HARD_FLUSH_STANDBY 2
472*81966bceSXin LI 
473*81966bceSXin LI /* command return values */
474*81966bceSXin LI #define   RETURN_PENDING             0
475*81966bceSXin LI #define   RETURN_SUCCESS             1
476*81966bceSXin LI #define   RETURN_BAD_DEVICE          2
477*81966bceSXin LI #define   RETURN_BAD_PARAMETER       3
478*81966bceSXin LI #define   RETURN_WRITE_NO_DRQ        4
479*81966bceSXin LI #define   RETURN_DEVICE_BUSY         5
480*81966bceSXin LI #define   RETURN_INVALID_REQUEST     6
481*81966bceSXin LI #define   RETURN_SELECTION_TIMEOUT   7
482*81966bceSXin LI #define   RETURN_IDE_ERROR           8
483*81966bceSXin LI #define   RETURN_NEED_LOGICAL_SG     9
484*81966bceSXin LI #define   RETURN_NEED_PHYSICAL_SG    10
485*81966bceSXin LI #define   RETURN_RETRY               11
486*81966bceSXin LI #define   RETURN_DATA_ERROR          12
487*81966bceSXin LI #define   RETURN_BUS_RESET           13
488*81966bceSXin LI #define   RETURN_BAD_TRANSFER_LENGTH 14
489*81966bceSXin LI #define   RETURN_INSUFFICIENT_MEMORY 15
490*81966bceSXin LI #define   RETURN_SECTOR_ERROR        16
491*81966bceSXin LI #define   RETURN_NEED_SPINUP         17
492*81966bceSXin LI 
493*81966bceSXin LI #if defined(__cplusplus)
494*81966bceSXin LI }
495*81966bceSXin LI #endif
496*81966bceSXin LI #endif
497