1 /** @file
2   The EFI_ATA_PASS_THRU_PROTOCOL provides information about an ATA controller and the ability
3   to send ATA Command Blocks to any ATA device attached to that ATA controller. The information
4   includes the attributes of the ATA controller.
5 
6   Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
7   This program and the accompanying materials
8   are licensed and made available under the terms and conditions of the BSD License
9   which accompanies this distribution.  The full text of the license may be found at
10   http://opensource.org/licenses/bsd-license.php
11 
12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #ifndef __ATA_PASS_THROUGH_H__
18 #define __ATA_PASS_THROUGH_H__
19 
20 #define EFI_ATA_PASS_THRU_PROTOCOL_GUID \
21   { \
22     0x1d3de7f0, 0x807, 0x424f, {0xaa, 0x69, 0x11, 0xa5, 0x4e, 0x19, 0xa4, 0x6f } \
23   }
24 
25 typedef struct _EFI_ATA_PASS_THRU_PROTOCOL EFI_ATA_PASS_THRU_PROTOCOL;
26 
27 typedef struct {
28   UINT32 Attributes;
29   UINT32 IoAlign;
30 } EFI_ATA_PASS_THRU_MODE;
31 
32 ///
33 /// If this bit is set, then the EFI_ATA_PASS_THRU_PROTOCOL interface is for physical
34 /// devices on the ATA controller.
35 ///
36 #define EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL   0x0001
37 ///
38 /// If this bit is set, then the EFI_ATA_PASS_THRU_PROTOCOL interface is for logical
39 /// devices on the ATA controller.
40 ///
41 #define EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL    0x0002
42 ///
43 /// If this bit is set, then the EFI_ATA_PASS_THRU_PROTOCOL interface supports non blocking
44 /// I/O. Every EFI_ATA_PASS_THRU_PROTOCOL must support blocking I/O. The support of non-blocking
45 /// I/O is optional.
46 ///
47 #define EFI_ATA_PASS_THRU_ATTRIBUTES_NONBLOCKIO 0x0004
48 
49 typedef struct _EFI_ATA_COMMAND_BLOCK {
50   UINT8 Reserved1[2];
51   UINT8 AtaCommand;
52   UINT8 AtaFeatures;
53   UINT8 AtaSectorNumber;
54   UINT8 AtaCylinderLow;
55   UINT8 AtaCylinderHigh;
56   UINT8 AtaDeviceHead;
57   UINT8 AtaSectorNumberExp;
58   UINT8 AtaCylinderLowExp;
59   UINT8 AtaCylinderHighExp;
60   UINT8 AtaFeaturesExp;
61   UINT8 AtaSectorCount;
62   UINT8 AtaSectorCountExp;
63   UINT8 Reserved2[6];
64 } EFI_ATA_COMMAND_BLOCK;
65 
66 typedef struct _EFI_ATA_STATUS_BLOCK {
67   UINT8 Reserved1[2];
68   UINT8 AtaStatus;
69   UINT8 AtaError;
70   UINT8 AtaSectorNumber;
71   UINT8 AtaCylinderLow;
72   UINT8 AtaCylinderHigh;
73   UINT8 AtaDeviceHead;
74   UINT8 AtaSectorNumberExp;
75   UINT8 AtaCylinderLowExp;
76   UINT8 AtaCylinderHighExp;
77   UINT8 Reserved2;
78   UINT8 AtaSectorCount;
79   UINT8 AtaSectorCountExp;
80   UINT8 Reserved3[6];
81 } EFI_ATA_STATUS_BLOCK;
82 
83 typedef UINT8 EFI_ATA_PASS_THRU_CMD_PROTOCOL;
84 
85 #define EFI_ATA_PASS_THRU_PROTOCOL_ATA_HARDWARE_RESET 0x00
86 #define EFI_ATA_PASS_THRU_PROTOCOL_ATA_SOFTWARE_RESET 0x01
87 #define EFI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA       0x02
88 #define EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN        0x04
89 #define EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT       0x05
90 #define EFI_ATA_PASS_THRU_PROTOCOL_DMA                0x06
91 #define EFI_ATA_PASS_THRU_PROTOCOL_DMA_QUEUED         0x07
92 #define EFI_ATA_PASS_THRU_PROTOCOL_DEVICE_DIAGNOSTIC  0x08
93 #define EFI_ATA_PASS_THRU_PROTOCOL_DEVICE_RESET       0x09
94 #define EFI_ATA_PASS_THRU_PROTOCOL_UDMA_DATA_IN       0x0A
95 #define EFI_ATA_PASS_THRU_PROTOCOL_UDMA_DATA_OUT      0x0B
96 #define EFI_ATA_PASS_THRU_PROTOCOL_FPDMA              0x0C
97 #define EFI_ATA_PASS_THRU_PROTOCOL_RETURN_RESPONSE    0xFF
98 
99 typedef UINT8 EFI_ATA_PASS_THRU_LENGTH;
100 
101 #define EFI_ATA_PASS_THRU_LENGTH_BYTES                0x80
102 
103 
104 #define EFI_ATA_PASS_THRU_LENGTH_MASK                 0x70
105 #define EFI_ATA_PASS_THRU_LENGTH_NO_DATA_TRANSFER     0x00
106 #define EFI_ATA_PASS_THRU_LENGTH_FEATURES             0x10
107 #define EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT         0x20
108 #define EFI_ATA_PASS_THRU_LENGTH_TPSIU                0x30
109 
110 #define EFI_ATA_PASS_THRU_LENGTH_COUNT                0x0F
111 
112 typedef struct {
113   ///
114   /// A pointer to the sense data that was generated by the execution of the ATA
115   /// command. It must be aligned to the boundary specified in the IoAlign field
116   /// in the EFI_ATA_PASS_THRU_MODE structure.
117   ///
118   EFI_ATA_STATUS_BLOCK           *Asb;
119   ///
120   /// A pointer to buffer that contains the Command Data Block to send to the ATA
121   /// device specified by Port and PortMultiplierPort.
122   ///
123   EFI_ATA_COMMAND_BLOCK          *Acb;
124   ///
125   /// The timeout, in 100 ns units, to use for the execution of this ATA command.
126   /// A Timeout value of 0 means that this function will wait indefinitely for the
127   /// ATA command to execute. If Timeout is greater than zero, then this function
128   /// will return EFI_TIMEOUT if the time required to execute the ATA command is
129   /// greater than Timeout.
130   ///
131   UINT64                         Timeout;
132   ///
133   /// A pointer to the data buffer to transfer between the ATA controller and the
134   /// ATA device for read and bidirectional commands. For all write and non data
135   /// commands where InTransferLength is 0 this field is optional and may be NULL.
136   /// If this field is not NULL, then it must be aligned on the boundary specified
137   /// by the IoAlign field in the EFI_ATA_PASS_THRU_MODE structure.
138   ///
139   VOID                           *InDataBuffer;
140   ///
141   /// A pointer to the data buffer to transfer between the ATA controller and the
142   /// ATA device for write or bidirectional commands. For all read and non data
143   /// commands where OutTransferLength is 0 this field is optional and may be NULL.
144   /// If this field is not NULL, then it must be aligned on the boundary specified
145   /// by the IoAlign field in the EFI_ATA_PASS_THRU_MODE structure.
146   ///
147   VOID                           *OutDataBuffer;
148   ///
149   /// On input, the size, in bytes, of InDataBuffer. On output, the number of bytes
150   /// transferred between the ATA controller and the ATA device. If InTransferLength
151   /// is larger than the ATA controller can handle, no data will be transferred,
152   /// InTransferLength will be updated to contain the number of bytes that the ATA
153   /// controller is able to transfer, and EFI_BAD_BUFFER_SIZE will be returned.
154   ///
155   UINT32                         InTransferLength;
156   ///
157   /// On Input, the size, in bytes of OutDataBuffer. On Output, the Number of bytes
158   /// transferred between ATA Controller and the ATA device. If OutTransferLength is
159   /// larger than the ATA controller can handle, no data will be transferred,
160   /// OutTransferLength will be updated to contain the number of bytes that the ATA
161   /// controller is able to transfer, and EFI_BAD_BUFFER_SIZE will be returned.
162   ///
163   UINT32                         OutTransferLength;
164   ///
165   /// Specifies the protocol used when the ATA device executes the command.
166   ///
167   EFI_ATA_PASS_THRU_CMD_PROTOCOL Protocol;
168   ///
169   /// Specifies the way in which the ATA command length is encoded.
170   ///
171   EFI_ATA_PASS_THRU_LENGTH       Length;
172 } EFI_ATA_PASS_THRU_COMMAND_PACKET;
173 
174 
175 /**
176   Sends an ATA command to an ATA device that is attached to the ATA controller. This function
177   supports both blocking I/O and non-blocking I/O. The blocking I/O functionality is required,
178   and the non-blocking I/O functionality is optional.
179 
180   @param[in]     This                A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
181   @param[in]     Port                The port number of the ATA device to send the command.
182   @param[in]     PortMultiplierPort  The port multiplier port number of the ATA device to send the command.
183                                      If there is no port multiplier, then specify 0.
184   @param[in,out] Packet              A pointer to the ATA command to send to the ATA device specified by Port
185                                      and PortMultiplierPort.
186   @param[in]     Event               If non-blocking I/O is not supported then Event is ignored, and blocking
187                                      I/O is performed. If Event is NULL, then blocking I/O is performed. If
188                                      Event is not NULL and non blocking I/O is supported, then non-blocking
189                                      I/O is performed, and Event will be signaled when the ATA command completes.
190 
191   @retval EFI_SUCCESS                The ATA command was sent by the host. For bi-directional commands,
192                                      InTransferLength bytes were transferred from InDataBuffer. For write and
193                                      bi-directional commands, OutTransferLength bytes were transferred by OutDataBuffer.
194   @retval EFI_BAD_BUFFER_SIZE        The ATA command was not executed. The number of bytes that could be transferred
195                                      is returned in InTransferLength. For write and bi-directional commands,
196                                      OutTransferLength bytes were transferred by OutDataBuffer.
197   @retval EFI_NOT_READY              The ATA command could not be sent because there are too many ATA commands
198                                      already queued. The caller may retry again later.
199   @retval EFI_DEVICE_ERROR           A device error occurred while attempting to send the ATA command.
200   @retval EFI_INVALID_PARAMETER      Port, PortMultiplierPort, or the contents of Acb are invalid. The ATA
201                                      command was not sent, so no additional status information is available.
202 
203 **/
204 typedef
205 EFI_STATUS
206 (EFIAPI *EFI_ATA_PASS_THRU_PASSTHRU)(
207   IN     EFI_ATA_PASS_THRU_PROTOCOL       *This,
208   IN     UINT16                           Port,
209   IN     UINT16                           PortMultiplierPort,
210   IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet,
211   IN     EFI_EVENT                        Event OPTIONAL
212   );
213 
214 /**
215   Used to retrieve the list of legal port numbers for ATA devices on an ATA controller.
216   These can either be the list of ports where ATA devices are actually present or the
217   list of legal port numbers for the ATA controller. Regardless, the caller of this
218   function must probe the port number returned to see if an ATA device is actually
219   present at that location on the ATA controller.
220 
221   The GetNextPort() function retrieves the port number on an ATA controller. If on input
222   Port is 0xFFFF, then the port number of the first port on the ATA controller is returned
223   in Port and EFI_SUCCESS is returned.
224 
225   If Port is a port number that was returned on a previous call to GetNextPort(), then the
226   port number of the next port on the ATA controller is returned in Port, and EFI_SUCCESS
227   is returned. If Port is not 0xFFFF and Port was not returned on a previous call to
228   GetNextPort(), then EFI_INVALID_PARAMETER is returned.
229 
230   If Port is the port number of the last port on the ATA controller, then EFI_NOT_FOUND is
231   returned.
232 
233   @param[in]     This           A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
234   @param[in,out] Port           On input, a pointer to the port number on the ATA controller.
235                                 On output, a pointer to the next port number on the ATA
236                                 controller. An input value of 0xFFFF retrieves the first port
237                                 number on the ATA controller.
238 
239   @retval EFI_SUCCESS           The next port number on the ATA controller was returned in Port.
240   @retval EFI_NOT_FOUND         There are no more ports on this ATA controller.
241   @retval EFI_INVALID_PARAMETER Port is not 0xFFFF and Port was not returned on a previous call
242                                 to GetNextPort().
243 
244 **/
245 typedef
246 EFI_STATUS
247 (EFIAPI *EFI_ATA_PASS_THRU_GET_NEXT_PORT)(
248   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
249   IN OUT UINT16                 *Port
250   );
251 
252 /**
253   Used to retrieve the list of legal port multiplier port numbers for ATA devices on a port of an ATA
254   controller. These can either be the list of port multiplier ports where ATA devices are actually
255   present on port or the list of legal port multiplier ports on that port. Regardless, the caller of this
256   function must probe the port number and port multiplier port number returned to see if an ATA
257   device is actually present.
258 
259   The GetNextDevice() function retrieves the port multiplier port number of an ATA device
260   present on a port of an ATA controller.
261 
262   If PortMultiplierPort points to a port multiplier port number value that was returned on a
263   previous call to GetNextDevice(), then the port multiplier port number of the next ATA device
264   on the port of the ATA controller is returned in PortMultiplierPort, and EFI_SUCCESS is
265   returned.
266 
267   If PortMultiplierPort points to 0xFFFF, then the port multiplier port number of the first
268   ATA device on port of the ATA controller is returned in PortMultiplierPort and
269   EFI_SUCCESS is returned.
270 
271   If PortMultiplierPort is not 0xFFFF and the value pointed to by PortMultiplierPort
272   was not returned on a previous call to GetNextDevice(), then EFI_INVALID_PARAMETER
273   is returned.
274 
275   If PortMultiplierPort is the port multiplier port number of the last ATA device on the port of
276   the ATA controller, then EFI_NOT_FOUND is returned.
277 
278   @param[in]     This                A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
279   @param[in]     Port                The port number present on the ATA controller.
280   @param[in,out] PortMultiplierPort  On input, a pointer to the port multiplier port number of an
281                                      ATA device present on the ATA controller.
282                                      If on input a PortMultiplierPort of 0xFFFF is specified,
283                                      then the port multiplier port number of the first ATA device
284                                      is returned. On output, a pointer to the port multiplier port
285                                      number of the next ATA device present on an ATA controller.
286 
287   @retval EFI_SUCCESS                The port multiplier port number of the next ATA device on the port
288                                      of the ATA controller was returned in PortMultiplierPort.
289   @retval EFI_NOT_FOUND              There are no more ATA devices on this port of the ATA controller.
290   @retval EFI_INVALID_PARAMETER      PortMultiplierPort is not 0xFFFF, and PortMultiplierPort was not
291                                      returned on a previous call to GetNextDevice().
292 
293 **/
294 typedef
295 EFI_STATUS
296 (EFIAPI *EFI_ATA_PASS_THRU_GET_NEXT_DEVICE)(
297   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
298   IN UINT16                     Port,
299   IN OUT UINT16                 *PortMultiplierPort
300   );
301 
302 /**
303   Used to allocate and build a device path node for an ATA device on an ATA controller.
304 
305   The BuildDevicePath() function allocates and builds a single device node for the ATA
306   device specified by Port and PortMultiplierPort. If the ATA device specified by Port and
307   PortMultiplierPort is not present on the ATA controller, then EFI_NOT_FOUND is returned.
308   If DevicePath is NULL, then EFI_INVALID_PARAMETER is returned. If there are not enough
309   resources to allocate the device path node, then EFI_OUT_OF_RESOURCES is returned.
310 
311   Otherwise, DevicePath is allocated with the boot service AllocatePool(), the contents of
312   DevicePath are initialized to describe the ATA device specified by Port and PortMultiplierPort,
313   and EFI_SUCCESS is returned.
314 
315   @param[in]     This                A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
316   @param[in]     Port                Port specifies the port number of the ATA device for which a
317                                      device path node is to be allocated and built.
318   @param[in]     PortMultiplierPort  The port multiplier port number of the ATA device for which a
319                                      device path node is to be allocated and built. If there is no
320                                      port multiplier, then specify 0.
321   @param[in,out] DevicePath          A pointer to a single device path node that describes the ATA
322                                      device specified by Port and PortMultiplierPort. This function
323                                      is responsible for allocating the buffer DevicePath with the
324                                      boot service AllocatePool(). It is the caller's responsibility
325                                      to free DevicePath when the caller is finished with DevicePath.
326   @retval EFI_SUCCESS                The device path node that describes the ATA device specified by
327                                      Port and PortMultiplierPort was allocated and returned in DevicePath.
328   @retval EFI_NOT_FOUND              The ATA device specified by Port and PortMultiplierPort does not
329                                      exist on the ATA controller.
330   @retval EFI_INVALID_PARAMETER      DevicePath is NULL.
331   @retval EFI_OUT_OF_RESOURCES       There are not enough resources to allocate DevicePath.
332 
333 **/
334 typedef
335 EFI_STATUS
336 (EFIAPI *EFI_ATA_PASS_THRU_BUILD_DEVICE_PATH)(
337   IN     EFI_ATA_PASS_THRU_PROTOCOL *This,
338   IN     UINT16                     Port,
339   IN     UINT16                     PortMultiplierPort,
340   IN OUT EFI_DEVICE_PATH_PROTOCOL   **DevicePath
341   );
342 
343 /**
344   Used to translate a device path node to a port number and port multiplier port number.
345 
346   The GetDevice() function determines the port and port multiplier port number associated with
347   the ATA device described by DevicePath. If DevicePath is a device path node type that the
348   ATA Pass Thru driver supports, then the ATA Pass Thru driver will attempt to translate the contents
349   DevicePath into a port number and port multiplier port number.
350 
351   If this translation is successful, then that port number and port multiplier port number are returned
352   in Port and PortMultiplierPort, and EFI_SUCCESS is returned.
353 
354   If DevicePath, Port, or PortMultiplierPort are NULL, then EFI_INVALID_PARAMETER is returned.
355 
356   If DevicePath is not a device path node type that the ATA Pass Thru driver supports, then
357   EFI_UNSUPPORTED is returned.
358 
359   If DevicePath is a device path node type that the ATA Pass Thru driver supports, but there is not
360   a valid translation from DevicePath to a port number and port multiplier port number, then
361   EFI_NOT_FOUND is returned.
362 
363   @param[in]  This                A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
364   @param[in]  DevicePath          A pointer to the device path node that describes an ATA device on the
365                                   ATA controller.
366   @param[out] Port                On return, points to the port number of an ATA device on the ATA controller.
367   @param[out] PortMultiplierPort  On return, points to the port multiplier port number of an ATA device
368                                   on the ATA controller.
369 
370   @retval EFI_SUCCESS             DevicePath was successfully translated to a port number and port multiplier
371                                   port number, and they were returned in Port and PortMultiplierPort.
372   @retval EFI_INVALID_PARAMETER   DevicePath is NULL.
373   @retval EFI_INVALID_PARAMETER   Port is NULL.
374   @retval EFI_INVALID_PARAMETER   PortMultiplierPort is NULL.
375   @retval EFI_UNSUPPORTED         This driver does not support the device path node type in DevicePath.
376   @retval EFI_NOT_FOUND           A valid translation from DevicePath to a port number and port multiplier
377                                   port number does not exist.
378 **/
379 typedef
380 EFI_STATUS
381 (EFIAPI *EFI_ATA_PASS_THRU_GET_DEVICE)(
382   IN  EFI_ATA_PASS_THRU_PROTOCOL *This,
383   IN  EFI_DEVICE_PATH_PROTOCOL   *DevicePath,
384   OUT UINT16                     *Port,
385   OUT UINT16                     *PortMultiplierPort
386   );
387 
388 /**
389   Resets a specific port on the ATA controller. This operation also resets all the ATA devices
390   connected to the port.
391 
392   The ResetChannel() function resets an a specific port on an ATA controller. This operation
393   resets all the ATA devices connected to that port. If this ATA controller does not support
394   a reset port operation, then EFI_UNSUPPORTED is returned.
395 
396   If a device error occurs while executing that port reset operation, then EFI_DEVICE_ERROR is
397   returned.
398 
399   If a timeout occurs during the execution of the port reset operation, then EFI_TIMEOUT is returned.
400 
401   If the port reset operation is completed, then EFI_SUCCESS is returned.
402 
403   @param[in]  This          A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
404   @param[in]  Port          The port number on the ATA controller.
405 
406   @retval EFI_SUCCESS       The ATA controller port was reset.
407   @retval EFI_UNSUPPORTED   The ATA controller does not support a port reset operation.
408   @retval EFI_DEVICE_ERROR  A device error occurred while attempting to reset the ATA port.
409   @retval EFI_TIMEOUT       A timeout occurred while attempting to reset the ATA port.
410 
411 **/
412 typedef
413 EFI_STATUS
414 (EFIAPI *EFI_ATA_PASS_THRU_RESET_PORT)(
415   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
416   IN UINT16                     Port
417   );
418 
419 /**
420   Resets an ATA device that is connected to an ATA controller.
421 
422   The ResetDevice() function resets the ATA device specified by Port and PortMultiplierPort.
423   If this ATA controller does not support a device reset operation, then EFI_UNSUPPORTED is
424   returned.
425 
426   If Port or PortMultiplierPort are not in a valid range for this ATA controller, then
427   EFI_INVALID_PARAMETER is returned.
428 
429   If a device error occurs while executing that device reset operation, then EFI_DEVICE_ERROR
430   is returned.
431 
432   If a timeout occurs during the execution of the device reset operation, then EFI_TIMEOUT is
433   returned.
434 
435   If the device reset operation is completed, then EFI_SUCCESS is returned.
436 
437   @param[in] This                A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
438   @param[in] Port                Port represents the port number of the ATA device to be reset.
439   @param[in] PortMultiplierPort  The port multiplier port number of the ATA device to reset.
440                                  If there is no port multiplier, then specify 0.
441   @retval EFI_SUCCESS            The ATA device specified by Port and PortMultiplierPort was reset.
442   @retval EFI_UNSUPPORTED        The ATA controller does not support a device reset operation.
443   @retval EFI_INVALID_PARAMETER  Port or PortMultiplierPort are invalid.
444   @retval EFI_DEVICE_ERROR       A device error occurred while attempting to reset the ATA device
445                                  specified by Port and PortMultiplierPort.
446   @retval EFI_TIMEOUT            A timeout occurred while attempting to reset the ATA device
447                                  specified by Port and PortMultiplierPort.
448 
449 **/
450 typedef
451 EFI_STATUS
452 (EFIAPI *EFI_ATA_PASS_THRU_RESET_DEVICE)(
453   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
454   IN UINT16                     Port,
455   IN UINT16                     PortMultiplierPort
456   );
457 
458 struct _EFI_ATA_PASS_THRU_PROTOCOL {
459   EFI_ATA_PASS_THRU_MODE               *Mode;
460   EFI_ATA_PASS_THRU_PASSTHRU           PassThru;
461   EFI_ATA_PASS_THRU_GET_NEXT_PORT      GetNextPort;
462   EFI_ATA_PASS_THRU_GET_NEXT_DEVICE    GetNextDevice;
463   EFI_ATA_PASS_THRU_BUILD_DEVICE_PATH  BuildDevicePath;
464   EFI_ATA_PASS_THRU_GET_DEVICE         GetDevice;
465   EFI_ATA_PASS_THRU_RESET_PORT         ResetPort;
466   EFI_ATA_PASS_THRU_RESET_DEVICE       ResetDevice;
467 };
468 
469 extern EFI_GUID gEfiAtaPassThruProtocolGuid;
470 
471 #endif
472