]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Bus/Pci/IdeBus/Dxe/ide.c
Update comments to conform to the new, Doxygen friendly, coding standard. These...
[mirror_edk2.git] / EdkModulePkg / Bus / Pci / IdeBus / Dxe / ide.c
index d318fd23df98c4188be7f8ae3b85c9abd1ff97e3..c41d9958792eb3d06896bf6049982b48d010d09e 100644 (file)
@@ -1,50 +1,34 @@
-/*++\r
+/** @file\r
+  Copyright (c) 2006, Intel Corporation                                                         \r
+  All rights reserved. This program and the accompanying materials                          \r
+  are licensed and made available under the terms and conditions of the BSD License         \r
+  which accompanies this distribution.  The full text of the license may be found at        \r
+  http://opensource.org/licenses/bsd-license.php                                            \r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
 \r
-Module Name:\r
-\r
-    ide.c\r
-    \r
-Abstract: \r
-    \r
-\r
-Revision History\r
---*/\r
+**/\r
 \r
 #include "idebus.h"\r
 \r
 BOOLEAN SlaveDeviceExist  = FALSE;\r
 BOOLEAN MasterDeviceExist = FALSE;\r
 \r
-UINT8\r
-IDEReadPortB (\r
-  IN  EFI_PCI_IO_PROTOCOL   *PciIo,\r
-  IN  UINT16                Port\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   TODO: Add function description\r
 \r
-Arguments:\r
-\r
-  PciIo - TODO: add argument description\r
-  Port  - TODO: add argument description\r
-\r
-Returns:\r
+  @param  PciIo TODO: add argument description\r
+  @param  Port TODO: add argument description\r
 \r
   TODO: add return values\r
 \r
---*/\r
+**/\r
+UINT8\r
+IDEReadPortB (\r
+  IN  EFI_PCI_IO_PROTOCOL   *PciIo,\r
+  IN  UINT16                Port\r
+  )\r
 {\r
   UINT8 Data;\r
 \r
@@ -63,6 +47,17 @@ Returns:
   return Data;\r
 }\r
 \r
+/**\r
+  Reads multiple words of data from the IDE data port. \r
+  Call the IO abstraction once to do the complete read,\r
+  not one word at a time\r
+\r
+  @param  PciIo Pointer to the EFI_PCI_IO instance\r
+  @param  Port IO port to read\r
+  @param  Count No. of UINT16's to read\r
+  @param  Buffer Pointer to the data buffer for read\r
+\r
+**/\r
 VOID\r
 IDEReadPortWMultiple (\r
   IN  EFI_PCI_IO_PROTOCOL   *PciIo,\r
@@ -70,23 +65,6 @@ IDEReadPortWMultiple (
   IN  UINTN                 Count,\r
   IN  VOID                  *Buffer\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Reads multiple words of data from the IDE data port. \r
-  Call the IO abstraction once to do the complete read,\r
-  not one word at a time\r
-  \r
-\r
-Arguments:\r
-  PciIo   - Pointer to the EFI_PCI_IO instance\r
-  Port    - IO port to read\r
-  Count   - No. of UINT16's to read\r
-  Buffer  - Pointer to the data buffer for read\r
-\r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
 {\r
   UINT16  *AlignedBuffer;\r
   UINT16  *WorkingBuffer;\r
@@ -127,29 +105,22 @@ Arguments:
   gBS->FreePool (WorkingBuffer);\r
 }\r
 \r
+/**\r
+  TODO: Add function description\r
+\r
+  @param  PciIo TODO: add argument description\r
+  @param  Port TODO: add argument description\r
+  @param  Data TODO: add argument description\r
+\r
+  TODO: add return values\r
+\r
+**/\r
 VOID\r
 IDEWritePortB (\r
   IN  EFI_PCI_IO_PROTOCOL   *PciIo,\r
   IN  UINT16                Port,\r
   IN  UINT8                 Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  PciIo - TODO: add argument description\r
-  Port  - TODO: add argument description\r
-  Data  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
 {\r
   //\r
   // perform 1-byte data write to register\r
@@ -165,29 +136,22 @@ Returns:
 \r
 }\r
 \r
+/**\r
+  TODO: Add function description\r
+\r
+  @param  PciIo TODO: add argument description\r
+  @param  Port TODO: add argument description\r
+  @param  Data TODO: add argument description\r
+\r
+  TODO: add return values\r
+\r
+**/\r
 VOID\r
 IDEWritePortW (\r
   IN  EFI_PCI_IO_PROTOCOL   *PciIo,\r
   IN  UINT16                Port,\r
   IN  UINT16                Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  PciIo - TODO: add argument description\r
-  Port  - TODO: add argument description\r
-  Data  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
 {\r
   //\r
   // perform 1-word data write to register\r
@@ -202,6 +166,17 @@ Returns:
               );\r
 }\r
 \r
+/**\r
+  Write multiple words of data to the IDE data port. \r
+  Call the IO abstraction once to do the complete read,\r
+  not one word at a time\r
+\r
+  @param  PciIo Pointer to the EFI_PCI_IO instance\r
+  @param  Port IO port to read\r
+  @param  Count No. of UINT16's to read\r
+  @param  Buffer Pointer to the data buffer for read\r
+\r
+**/\r
 VOID\r
 IDEWritePortWMultiple (\r
   IN  EFI_PCI_IO_PROTOCOL   *PciIo,\r
@@ -209,23 +184,6 @@ IDEWritePortWMultiple (
   IN  UINTN                 Count,\r
   IN  VOID                  *Buffer\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Write multiple words of data to the IDE data port. \r
-  Call the IO abstraction once to do the complete read,\r
-  not one word at a time\r
-  \r
-\r
-Arguments:\r
-  PciIo   - Pointer to the EFI_PCI_IO instance\r
-  Port    - IO port to read\r
-  Count   - No. of UINT16's to read\r
-  Buffer  - Pointer to the data buffer for read\r
-\r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
 {\r
   UINT16  *AlignedBuffer;\r
   UINT32  *WorkingBuffer;\r
@@ -267,25 +225,18 @@ Arguments:
   gBS->FreePool (WorkingBuffer);\r
 }\r
 \r
-BOOLEAN\r
-BadIdeDeviceCheck (\r
-  IN IDE_BLK_IO_DEV *IdeDev\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   TODO: Add function description\r
 \r
-Arguments:\r
-\r
-  IdeDev  - TODO: add argument description\r
-\r
-Returns:\r
+  @param  IdeDev TODO: add argument description\r
 \r
   TODO: add return values\r
 \r
---*/\r
+**/\r
+BOOLEAN\r
+BadIdeDeviceCheck (\r
+  IN IDE_BLK_IO_DEV *IdeDev\r
+  )\r
 {\r
   //\r
   //  check whether all registers return 0xff,\r
@@ -341,63 +292,62 @@ Returns:
 //\r
 // GetIdeRegistersBaseAddr\r
 //\r
-EFI_STATUS\r
-GetIdeRegistersBaseAddr (\r
-  IN  EFI_PCI_IO_PROTOCOL         *PciIo,\r
-  OUT IDE_REGISTERS_BASE_ADDR     *IdeRegsBaseAddr\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
   Get IDE IO port registers' base addresses by mode. In 'Compatibility' mode,\r
   use fixed addresses. In Native-PCI mode, get base addresses from BARs in\r
   the PCI IDE controller's Configuration Space.\r
-  \r
+\r
   The steps to get IDE IO port registers' base addresses for each channel \r
   as follows:\r
 \r
   1. Examine the Programming Interface byte of the Class Code fields in PCI IDE \r
-     controller's Configuration Space to determine the operating mode.\r
-     \r
+  controller's Configuration Space to determine the operating mode.\r
+\r
   2. a) In 'Compatibility' mode, use fixed addresses shown in the Table 1 below.\r
-                 ___________________________________________\r
-                |           | Command Block | Control Block |\r
-                |  Channel  |   Registers   |   Registers   |\r
-                |___________|_______________|_______________|\r
-                |  Primary  |  1F0h - 1F7h  |  3F6h - 3F7h  |\r
-                |___________|_______________|_______________|\r
-                | Secondary |  170h - 177h  |  376h - 377h  |\r
-                |___________|_______________|_______________|\r
-        \r
-                  Table 1. Compatibility resource mappings\r
-        \r
-     b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs\r
-        in IDE controller's PCI Configuration Space, shown in the Table 2 below.\r
-               ___________________________________________________\r
-              |           |   Command Block   |   Control Block   |\r
-              |  Channel  |     Registers     |     Registers     |\r
-              |___________|___________________|___________________|\r
-              |  Primary  | BAR at offset 0x10| BAR at offset 0x14|\r
-              |___________|___________________|___________________|\r
-              | Secondary | BAR at offset 0x18| BAR at offset 0x1C|\r
-              |___________|___________________|___________________|\r
-      \r
-                        Table 2. BARs for Register Mapping\r
-        Note: Refer to Intel ICH4 datasheet, Control Block Offset: 03F4h for \r
-              primary, 0374h for secondary. So 2 bytes extra offset should be \r
-              added to the base addresses read from BARs.\r
-  \r
+  <pre>\r
+  ___________________________________________\r
+  |           | Command Block | Control Block |\r
+  |  Channel  |   Registers   |   Registers   |\r
+  |___________|_______________|_______________|\r
+  |  Primary  |  1F0h - 1F7h  |  3F6h - 3F7h  |\r
+  |___________|_______________|_______________|\r
+  | Secondary |  170h - 177h  |  376h - 377h  |\r
+  |___________|_______________|_______________|\r
+\r
+  Table 1. Compatibility resource mappings\r
+  </pre>\r
+\r
+  b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs\r
+  in IDE controller's PCI Configuration Space, shown in the Table 2 below.\r
+  <pre>\r
+  ___________________________________________________\r
+  |           |   Command Block   |   Control Block   |\r
+  |  Channel  |     Registers     |     Registers     |\r
+  |___________|___________________|___________________|\r
+  |  Primary  | BAR at offset 0x10| BAR at offset 0x14|\r
+  |___________|___________________|___________________|\r
+  | Secondary | BAR at offset 0x18| BAR at offset 0x1C|\r
+  |___________|___________________|___________________|\r
+\r
+  Table 2. BARs for Register Mapping\r
+  </pre>\r
+  @note Refer to Intel ICH4 datasheet, Control Block Offset: 03F4h for \r
+  primary, 0374h for secondary. So 2 bytes extra offset should be \r
+  added to the base addresses read from BARs.\r
+\r
   For more details, please refer to PCI IDE Controller Specification and Intel \r
   ICH4 Datasheet.\r
-  \r
-Arguments:\r
-  PciIo             - Pointer to the EFI_PCI_IO_PROTOCOL instance\r
-  IdeRegsBaseAddr   - Pointer to IDE_REGISTERS_BASE_ADDR to \r
-                      receive IDE IO port registers' base addresses\r
-                      \r
-Returns:\r
-    \r
---*/\r
+\r
+  @param  PciIo Pointer to the EFI_PCI_IO_PROTOCOL instance\r
+  @param  IdeRegsBaseAddr Pointer to IDE_REGISTERS_BASE_ADDR to\r
+  receive IDE IO port registers' base addresses\r
+\r
+**/\r
+EFI_STATUS\r
+GetIdeRegistersBaseAddr (\r
+  IN  EFI_PCI_IO_PROTOCOL         *PciIo,\r
+  OUT IDE_REGISTERS_BASE_ADDR     *IdeRegsBaseAddr\r
+  )\r
 // TODO:    EFI_UNSUPPORTED - add return value to function comment\r
 // TODO:    EFI_UNSUPPORTED - add return value to function comment\r
 // TODO:    EFI_SUCCESS - add return value to function comment\r
@@ -464,24 +414,19 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-ReassignIdeResources (\r
-  IN  IDE_BLK_IO_DEV  *IdeDev\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
   This function is used to requery IDE resources. The IDE controller will \r
   probably switch between native and legacy modes during the EFI->CSM->OS \r
   transfer. We do this everytime before an BlkIo operation to ensure its\r
   succeess.\r
-  \r
-Arguments:\r
-  IdeDev - The BLK_IO private data which specifies the IDE device\r
-  \r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
+\r
+  @param  IdeDev The BLK_IO private data which specifies the IDE device\r
+\r
+**/\r
+EFI_STATUS\r
+ReassignIdeResources (\r
+  IN  IDE_BLK_IO_DEV  *IdeDev\r
+  )\r
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS              Status;\r
@@ -519,22 +464,16 @@ Arguments:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Read SATA registers to detect SATA disks\r
+\r
+  @param  IdeDev The BLK_IO private data which specifies the IDE device\r
+\r
+**/\r
 EFI_STATUS\r
 CheckPowerMode (\r
   IDE_BLK_IO_DEV    *IdeDev\r
   )\r
-/*++\r
- Routine Description:\r
\r
-  Read SATA registers to detect SATA disks\r
-\r
- Arguments:\r
-\r
-  IdeDev - The BLK_IO private data which specifies the IDE device\r
-  \r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
 // TODO:    EFI_NOT_FOUND - add return value to function comment\r
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 // TODO:    EFI_NOT_FOUND - add return value to function comment\r
@@ -579,22 +518,16 @@ CheckPowerMode (
 //\r
 // DiscoverIdeDevice\r
 //\r
+/**\r
+  Detect if there is disk connected to this port\r
+\r
+  @param  IdeDev The BLK_IO private data which specifies the IDE device\r
+\r
+**/\r
 EFI_STATUS\r
 DiscoverIdeDevice (\r
   IN IDE_BLK_IO_DEV *IdeDev\r
   )\r
-/*++\r
- Routine Description:\r
\r
-  Detect if there is disk connected to this port\r
-\r
- Arguments:\r
-\r
-  IdeDev - The BLK_IO private data which specifies the IDE device\r
-  \r
-++*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Returns:'\r
 // TODO:    EFI_NOT_FOUND - add return value to function comment\r
 // TODO:    EFI_NOT_FOUND - add return value to function comment\r
 // TODO:    EFI_SUCCESS - add return value to function comment\r
@@ -662,54 +595,42 @@ DiscoverIdeDevice (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-DetectIDEController (\r
-  IN  IDE_BLK_IO_DEV  *IdeDev\r
-  )\r
-/*++\r
-  \r
-  Name: DetectIDEController\r
-\r
-\r
-  Purpose: \r
-      This function is called by DiscoverIdeDevice(). It is used for detect \r
-      whether the IDE device exists in the specified Channel as the specified \r
-      Device Number.\r
-\r
-      There is two IDE channels: one is Primary Channel, the other is \r
-      Secondary Channel.(Channel is the logical name for the physical "Cable".) \r
-      Different channel has different register group.\r
+/**\r
+  This function is called by DiscoverIdeDevice(). It is used for detect \r
+  whether the IDE device exists in the specified Channel as the specified \r
+  Device Number.\r
 \r
-      On each IDE channel, at most two IDE devices attach, \r
-      one is called Device 0 (Master device), the other is called Device 1 \r
-      (Slave device). The devices on the same channel co-use the same register \r
-      group, so before sending out a command for a specified device via command \r
-      register, it is a must to select the current device to accept the command \r
-      by set the device number in the Head/Device Register.\r
\r
-            \r
-  Parameters:\r
-      IDE_BLK_IO_DEV  IN    *IdeDev\r
-            pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-            to record all the information of the IDE device.\r
+  There is two IDE channels: one is Primary Channel, the other is \r
+  Secondary Channel.(Channel is the logical name for the physical "Cable".) \r
+  Different channel has different register group.\r
 \r
+  On each IDE channel, at most two IDE devices attach, \r
+  one is called Device 0 (Master device), the other is called Device 1 \r
+  (Slave device). The devices on the same channel co-use the same register \r
+  group, so before sending out a command for a specified device via command \r
+  register, it is a must to select the current device to accept the command \r
+  by set the device number in the Head/Device Register.\r
 \r
-  Returns:    \r
-      TRUE      \r
-            successfully detects device.\r
+  @param[in] *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
 \r
-      FALSE\r
-            any failure during detection process will return this\r
-            value.\r
+  @retval TRUE\r
+  successfully detects device.\r
+  \r
+  @retval FALSE\r
+  any failure during detection process will return this\r
+  value.\r
 \r
+  @note\r
+  TODO:    EFI_SUCCESS - add return value to function comment\r
+  TODO:    EFI_NOT_FOUND - add return value to function comment\r
 \r
-  Notes:\r
---*/\r
-// TODO: function comment is missing 'Routine Description:'\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO:    IdeDev - add argument and description to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
-// TODO:    EFI_NOT_FOUND - add return value to function comment\r
+**/\r
+EFI_STATUS\r
+DetectIDEController (\r
+  IN  IDE_BLK_IO_DEV  *IdeDev\r
+  )\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       ErrorReg;\r
@@ -846,40 +767,33 @@ DetectIDEController (
 \r
 }\r
 \r
+/**\r
+  This function is used to poll for the DRQ bit clear in the Status \r
+  Register. DRQ is cleared when the device is finished transferring data. \r
+  So this function is called after data transfer is finished.\r
+\r
+  @param[in] *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
+  \r
+  @param[in] TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ clear.\r
+\r
+  @retval EFI_SUCCESS\r
+  DRQ bit clear within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  DRQ bit not clear within the time out.\r
+\r
+  @note\r
+  Read Status Register will clear interrupt status.\r
+\r
+**/\r
 EFI_STATUS\r
 DRQClear (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
   IN  UINTN           TimeoutInMilliSeconds\r
   )\r
-/*++\r
-  Name:   DRQClear\r
-\r
-\r
-  Purpose: \r
-        This function is used to poll for the DRQ bit clear in the Status \r
-        Register. DRQ is cleared when the device is finished transferring data. \r
-        So this function is called after data transfer is finished.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-            pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-            to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-            used to designate the timeout for the DRQ clear.\r
-\r
-  Returns:  \r
-        EFI_SUCCESS\r
-            DRQ bit clear within the time out.\r
-\r
-        EFI_TIMEOUT\r
-            DRQ bit not clear within the time out. \r
-\r
-\r
-  Notes:\r
-        Read Status Register will clear interrupt status.\r
---*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -926,41 +840,34 @@ DRQClear (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  This function is used to poll for the DRQ bit clear in the Alternate \r
+  Status Register. DRQ is cleared when the device is finished \r
+  transferring data. So this function is called after data transfer\r
+  is finished.\r
+\r
+  @param[in] *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
+  \r
+  @param[in] TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ clear.\r
+\r
+  @retval EFI_SUCCESS\r
+  DRQ bit clear within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  DRQ bit not clear within the time out.\r
+\r
+  @note\r
+  Read Alternate Status Register will not clear interrupt status.\r
+\r
+**/\r
 EFI_STATUS\r
 DRQClear2 (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
   IN  UINTN           TimeoutInMilliSeconds\r
   )\r
-/*++\r
-  Name:   DRQClear2\r
-\r
-\r
-  Purpose: \r
-        This function is used to poll for the DRQ bit clear in the Alternate \r
-        Status Register. DRQ is cleared when the device is finished \r
-        transferring data. So this function is called after data transfer\r
-        is finished.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-          pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-          to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-          used to designate the timeout for the DRQ clear.\r
-\r
-  Returns:  \r
-        EFI_SUCCESS\r
-          DRQ bit clear within the time out.\r
-\r
-        EFI_TIMEOUT\r
-          DRQ bit not clear within the time out. \r
-\r
-\r
-  Notes:\r
-        Read Alternate Status Register will not clear interrupt status.\r
---*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -1007,46 +914,38 @@ DRQClear2 (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-DRQReady (\r
-  IN  IDE_BLK_IO_DEV  *IdeDev,\r
-  IN  UINTN           TimeoutInMilliSeconds\r
-  )\r
-/*++\r
-  Name:   DRQReady\r
+/**\r
+  This function is used to poll for the DRQ bit set in the \r
+  Status Register.\r
+  DRQ is set when the device is ready to transfer data. So this function\r
+  is called after the command is sent to the device and before required \r
+  data is transferred.\r
 \r
+  @param[in] IDE_BLK_IO_DEV  IN    *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure,used\r
+  to record all the information of the IDE device.\r
   \r
-  Purpose: \r
-        This function is used to poll for the DRQ bit set in the \r
-        Status Register.\r
-        DRQ is set when the device is ready to transfer data. So this function\r
-        is called after the command is sent to the device and before required \r
-        data is transferred.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-            pointer pointing to IDE_BLK_IO_DEV data structure,used\r
-            to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-            used to designate the timeout for the DRQ ready.\r
-\r
+  @param[in] UINTN     IN    TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ ready.\r
 \r
-  Returns:  \r
-        EFI_SUCCESS\r
-            DRQ bit set within the time out.\r
-\r
-        EFI_TIMEOUT\r
-            DRQ bit not set within the time out.\r
-            \r
-        EFI_ABORTED\r
-            DRQ bit not set caused by the command abort.\r
+  @retval EFI_SUCCESS\r
+  DRQ bit set within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  DRQ bit not set within the time out.\r
+  \r
+  @retval EFI_ABORTED\r
+  DRQ bit not set caused by the command abort.\r
 \r
-  Notes:\r
-        Read Status Register will clear interrupt status.\r
+  @note\r
+  Read Status Register will clear interrupt status.\r
 \r
---*/\r
+**/\r
+EFI_STATUS\r
+DRQReady (\r
+  IN  IDE_BLK_IO_DEV  *IdeDev,\r
+  IN  UINTN           TimeoutInMilliSeconds\r
+  )\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -1093,43 +992,37 @@ DRQReady (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  This function is used to poll for the DRQ bit set in the \r
+  Alternate Status Register. DRQ is set when the device is ready to \r
+  transfer data. So this function is called after the command \r
+  is sent to the device and before required data is transferred.\r
+\r
+  @param[in] IDE_BLK_IO_DEV  IN    *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
+  \r
+  @param[in] UINTN     IN    TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ ready.\r
+\r
+  @retval EFI_SUCCESS\r
+  DRQ bit set within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  DRQ bit not set within the time out.\r
+  \r
+  @retval EFI_ABORTED\r
+  DRQ bit not set caused by the command abort.\r
+\r
+  @note\r
+  Read Alternate Status Register will not clear interrupt status.\r
+\r
+**/\r
 EFI_STATUS\r
 DRQReady2 (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
   IN  UINTN           TimeoutInMilliSeconds\r
   )\r
-/*++\r
-  Name:   DRQReady2\r
-\r
-\r
-  Purpose: \r
-        This function is used to poll for the DRQ bit set in the \r
-        Alternate Status Register. DRQ is set when the device is ready to \r
-        transfer data. So this function is called after the command \r
-        is sent to the device and before required data is transferred.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-          pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-          to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-          used to designate the timeout for the DRQ ready.\r
-\r
-  Returns:  \r
-        EFI_SUCCESS\r
-          DRQ bit set within the time out.\r
-\r
-        EFI_TIMEOUT\r
-          DRQ bit not set within the time out. \r
-        \r
-        EFI_ABORTED\r
-            DRQ bit not set caused by the command abort.\r
-\r
-  Notes:\r
-        Read Alternate Status Register will not clear interrupt status.\r
---*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -1176,41 +1069,33 @@ DRQReady2 (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  This function is used to poll for the BSY bit clear in the \r
+  Status Register. BSY is clear when the device is not busy.\r
+  Every command must be sent after device is not busy.\r
+\r
+  @param[in] IDE_BLK_IO_DEV  IN    *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
+  \r
+  @param[in] UINTN     IN    TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ ready.\r
+\r
+  @retval EFI_SUCCESS\r
+  BSY bit clear within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  BSY bit not clear within the time out.\r
+\r
+  @note\r
+  Read Status Register will clear interrupt status.\r
+\r
+**/\r
 EFI_STATUS\r
 WaitForBSYClear (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
   IN  UINTN           TimeoutInMilliSeconds\r
   )\r
-/*++\r
-  Name:\r
-        WaitForBSYClear\r
-\r
-\r
-  Purpose: \r
-        This function is used to poll for the BSY bit clear in the \r
-        Status Register. BSY is clear when the device is not busy.\r
-        Every command must be sent after device is not busy.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-          pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-          to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-          used to designate the timeout for the DRQ ready.\r
-\r
-  Returns:  \r
-        EFI_SUCCESS\r
-          BSY bit clear within the time out.\r
-\r
-        EFI_TIMEOUT\r
-          BSY bit not clear within the time out. \r
-\r
-\r
-  Notes:\r
-        Read Status Register will clear interrupt status.\r
---*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -1245,41 +1130,33 @@ WaitForBSYClear (
 //\r
 // WaitForBSYClear2\r
 //\r
+/**\r
+  This function is used to poll for the BSY bit clear in the \r
+  Alternate Status Register. BSY is clear when the device is not busy.\r
+  Every command must be sent after device is not busy.\r
+\r
+  @param[in] IDE_BLK_IO_DEV  IN    *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
+  \r
+  @param[in] UINTN     IN    TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ ready.\r
+\r
+  @retval EFI_SUCCESS\r
+  BSY bit clear within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  BSY bit not clear within the time out.\r
+\r
+  @note\r
+  Read Alternate Status Register will not clear interrupt status.\r
+\r
+**/\r
 EFI_STATUS\r
 WaitForBSYClear2 (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
   IN  UINTN           TimeoutInMilliSeconds\r
   )\r
-/*++\r
-  Name:\r
-        WaitForBSYClear2\r
-\r
-\r
-  Purpose: \r
-        This function is used to poll for the BSY bit clear in the \r
-        Alternate Status Register. BSY is clear when the device is not busy.\r
-        Every command must be sent after device is not busy.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-          pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-          to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-          used to designate the timeout for the DRQ ready.\r
-\r
-  Returns:  \r
-        EFI_SUCCESS\r
-          BSY bit clear within the time out.\r
-\r
-        EFI_TIMEOUT\r
-          BSY bit not clear within the time out. \r
-\r
-\r
-  Notes:\r
-        Read Alternate Status Register will not clear interrupt status.\r
---*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -1311,42 +1188,34 @@ WaitForBSYClear2 (
 //\r
 // DRDYReady\r
 //\r
+/**\r
+  This function is used to poll for the DRDY bit set in the \r
+  Status Register. DRDY bit is set when the device is ready \r
+  to accept command. Most ATA commands must be sent after \r
+  DRDY set except the ATAPI Packet Command.\r
+\r
+  @param[in] IDE_BLK_IO_DEV  IN    *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
+  \r
+  @param[in] UINTN     IN    TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ ready.\r
+\r
+  @retval EFI_SUCCESS\r
+  DRDY bit set within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  DRDY bit not set within the time out.\r
+\r
+  @note\r
+  Read Status Register will clear interrupt status.\r
+\r
+**/\r
 EFI_STATUS\r
 DRDYReady (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
   IN  UINTN           DelayInMilliSeconds\r
   )\r
-/*++\r
-  Name:\r
-        DRDYReady\r
-\r
-\r
-  Purpose: \r
-        This function is used to poll for the DRDY bit set in the \r
-        Status Register. DRDY bit is set when the device is ready \r
-        to accept command. Most ATA commands must be sent after \r
-        DRDY set except the ATAPI Packet Command.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-          pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-          to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-          used to designate the timeout for the DRQ ready.\r
-\r
-  Returns:  \r
-        EFI_SUCCESS\r
-          DRDY bit set within the time out.\r
-\r
-        EFI_TIMEOUT\r
-          DRDY bit not set within the time out. \r
-\r
-\r
-  Notes:\r
-        Read Status Register will clear interrupt status.\r
---*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -1390,42 +1259,34 @@ DRDYReady (
 //\r
 // DRDYReady2\r
 //\r
+/**\r
+  This function is used to poll for the DRDY bit set in the \r
+  Alternate Status Register. DRDY bit is set when the device is ready \r
+  to accept command. Most ATA commands must be sent after \r
+  DRDY set except the ATAPI Packet Command.\r
+\r
+  @param[in] IDE_BLK_IO_DEV  IN    *IdeDev\r
+  pointer pointing to IDE_BLK_IO_DEV data structure, used\r
+  to record all the information of the IDE device.\r
+  \r
+  @param[in] UINTN     IN    TimeoutInMilliSeconds\r
+  used to designate the timeout for the DRQ ready.\r
+\r
+  @retval EFI_SUCCESS\r
+  DRDY bit set within the time out.\r
+  \r
+  @retval EFI_TIMEOUT\r
+  DRDY bit not set within the time out.\r
+\r
+  @note\r
+  Read Alternate Status Register will clear interrupt status.\r
+\r
+**/\r
 EFI_STATUS\r
 DRDYReady2 (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
   IN  UINTN           DelayInMilliSeconds\r
   )\r
-/*++\r
-  Name:\r
-        DRDYReady2\r
-\r
-\r
-  Purpose: \r
-        This function is used to poll for the DRDY bit set in the \r
-        Alternate Status Register. DRDY bit is set when the device is ready \r
-        to accept command. Most ATA commands must be sent after \r
-        DRDY set except the ATAPI Packet Command.\r
-\r
-\r
-  Parameters:\r
-        IDE_BLK_IO_DEV  IN    *IdeDev\r
-          pointer pointing to IDE_BLK_IO_DEV data structure, used\r
-          to record all the information of the IDE device.\r
-\r
-        UINTN     IN    TimeoutInMilliSeconds\r
-          used to designate the timeout for the DRQ ready.\r
-\r
-  Returns:  \r
-        EFI_SUCCESS\r
-          DRDY bit set within the time out.\r
-\r
-        EFI_TIMEOUT\r
-          DRDY bit not set within the time out. \r
-\r
-\r
-  Notes:\r
-        Read Alternate Status Register will clear interrupt status.\r
---*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 // TODO: function comment is missing 'Arguments:'\r
 // TODO:    IdeDev - add argument and description to function comment\r
@@ -1469,52 +1330,34 @@ DRDYReady2 (
 //\r
 // SwapStringChars\r
 //\r
+/**\r
+  This function is a helper function used to change the char order in a \r
+  string. It is designed specially for the PrintAtaModuleName() function.\r
+  After the IDE device is detected, the IDE driver gets the device module\r
+  name by sending ATA command called ATA Identify Command or ATAPI \r
+  Identify Command to the specified IDE device. The module name returned \r
+  is a string of ASCII characters: the first character is bit8--bit15 \r
+  of the first word, the second character is bit0--bit7 of the first word \r
+  and so on. Thus the string can not be print directly before it is \r
+  preprocessed by this func to change the order of characters in \r
+  each word in the string.\r
+\r
+  @param[in] CHAR8 IN    *Destination\r
+  Indicates the destination string.\r
+  \r
+  @param[in] CHAR8 IN    *Source\r
+  Indicates the source string.\r
+  \r
+  @param[in] UINT8 IN    Size\r
+  the length of the string\r
+\r
+**/\r
 VOID\r
 SwapStringChars (\r
   IN CHAR8  *Destination,\r
   IN CHAR8  *Source,\r
   IN UINT32 Size\r
   )\r
-/*++\r
-  Name:\r
-        SwapStringChars\r
-\r
-\r
-  Purpose: \r
-        This function is a helper function used to change the char order in a \r
-        string. It is designed specially for the PrintAtaModuleName() function.\r
-        After the IDE device is detected, the IDE driver gets the device module\r
-        name by sending ATA command called ATA Identify Command or ATAPI \r
-        Identify Command to the specified IDE device. The module name returned \r
-        is a string of ASCII characters: the first character is bit8--bit15 \r
-        of the first word, the second character is bit0--bit7 of the first word \r
-        and so on. Thus the string can not be print directly before it is \r
-        preprocessed by this func to change the order of characters in \r
-        each word in the string.\r
-\r
-\r
-  Parameters:\r
-        CHAR8 IN    *Destination\r
-          Indicates the destination string.\r
-\r
-        CHAR8 IN    *Source\r
-          Indicates the source string.\r
-\r
-        UINT8 IN    Size\r
-          the length of the string\r
-\r
-\r
-  Returns:  \r
-        none\r
-\r
-  Notes:\r
-\r
---*/\r
-// TODO: function comment is missing 'Routine Description:'\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO:    Destination - add argument and description to function comment\r
-// TODO:    Source - add argument and description to function comment\r
-// TODO:    Size - add argument and description to function comment\r
 {\r
   UINT32  Index;\r
   CHAR8   Temp;\r
@@ -1530,26 +1373,16 @@ SwapStringChars (
 //\r
 // ReleaseIdeResources\r
 //\r
+/**\r
+  Release resources of an IDE device before stopping it.\r
+\r
+  @param[in] *IdeBlkIoDevice  Standard IDE device private data structure\r
+\r
+**/\r
 VOID\r
 ReleaseIdeResources (\r
   IN  IDE_BLK_IO_DEV  *IdeBlkIoDevice\r
   )\r
-/*++\r
-Routing Description:\r
-\r
-  Release resources of an IDE device before stopping it.\r
-\r
-Arguments:\r
-\r
-  IdeBlkIoDevice  --  Standard IDE device private data structure\r
-\r
-\r
-Returns:\r
-\r
-    NONE\r
-    \r
----*/\r
-// TODO: function comment is missing 'Routine Description:'\r
 {\r
   if (IdeBlkIoDevice == NULL) {\r
     return ;\r
@@ -1601,26 +1434,20 @@ Returns:
 //\r
 // SetDeviceTransferMode\r
 //\r
+/**\r
+  Set the calculated Best transfer mode to a detected device\r
+\r
+  @param[in] *IdeDev       Standard IDE device private data structure\r
+  @param[in] *TransferMode The device transfer mode to be set\r
+\r
+  @return Set transfer mode Command execute status\r
+\r
+**/\r
 EFI_STATUS\r
 SetDeviceTransferMode (\r
   IN IDE_BLK_IO_DEV       *IdeDev,\r
   IN ATA_TRANSFER_MODE    *TransferMode\r
   )\r
-/*++\r
-Routing Description:\r
-\r
-  Set the calculated Best transfer mode to a detected device\r
-\r
-Arguments:\r
-\r
-  IdeDev       --  Standard IDE device private data structure\r
-  TransferMode --  The device transfer mode to be set\r
-\r
-Returns:\r
-\r
-    Set transfer mode Command execute status\r
-    \r
----*/\r
 // TODO: function comment is missing 'Routine Description:'\r
 {\r
   EFI_STATUS  Status;\r
@@ -1648,6 +1475,23 @@ Returns:
   return Status;\r
 }\r
 \r
+/**\r
+  Send ATA command into device with NON_DATA protocol\r
+\r
+  @param  IdeDev Standard IDE device private data structure\r
+  @param  AtaCommand The ATA command to be sent\r
+  @param  Device The value in Device register\r
+  @param  Feature The value in Feature register\r
+  @param  SectorCount The value in SectorCount register\r
+  @param  LbaLow The value in LBA_LOW register\r
+  @param  LbaMiddle The value in LBA_MIDDLE register\r
+  @param  LbaHigh The value in LBA_HIGH register\r
+\r
+  @retval  EFI_SUCCESS Reading succeed\r
+  @retval  EFI_ABORTED Command failed\r
+  @retval  EFI_DEVICE_ERROR Device status error\r
+\r
+**/\r
 EFI_STATUS\r
 AtaNonDataCommandIn (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
@@ -1659,30 +1503,6 @@ AtaNonDataCommandIn (
   IN  UINT8           LbaMiddle,\r
   IN  UINT8           LbaHigh\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Send ATA command into device with NON_DATA protocol\r
-\r
-Arguments:\r
-\r
-  IdeDev      - Standard IDE device private data structure\r
-  AtaCommand  - The ATA command to be sent\r
-  Device      - The value in Device register\r
-  Feature     - The value in Feature register\r
-  SectorCount - The value in SectorCount register \r
-  LbaLow      - The value in LBA_LOW register\r
-  LbaMiddle   - The value in LBA_MIDDLE register\r
-  LbaHigh     - The value in LBA_HIGH register\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS      - Reading succeed\r
-  EFI_ABORTED      - Command failed\r
-  EFI_DEVICE_ERROR - Device status error\r
-\r
---*/\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       StatusRegister;\r
@@ -1743,6 +1563,21 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Send ATA Ext command into device with NON_DATA protocol\r
+\r
+  @param  IdeDev Standard IDE device private data structure\r
+  @param  AtaCommand The ATA command to be sent\r
+  @param  Device The value in Device register\r
+  @param  Feature The value in Feature register\r
+  @param  SectorCount The value in SectorCount register\r
+  @param  LbaAddress The LBA address in 48-bit mode\r
+\r
+  @retval  EFI_SUCCESS Reading succeed\r
+  @retval  EFI_ABORTED Command failed\r
+  @retval  EFI_DEVICE_ERROR Device status error\r
+\r
+**/\r
 EFI_STATUS\r
 AtaNonDataCommandInExt (\r
   IN  IDE_BLK_IO_DEV  *IdeDev,\r
@@ -1752,28 +1587,6 @@ AtaNonDataCommandInExt (
   IN  UINT16          SectorCount,\r
   IN  EFI_LBA         LbaAddress\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Send ATA Ext command into device with NON_DATA protocol\r
-\r
-Arguments:\r
-\r
-  IdeDev      - Standard IDE device private data structure\r
-  AtaCommand  - The ATA command to be sent\r
-  Device      - The value in Device register\r
-  Feature     - The value in Feature register\r
-  SectorCount - The value in SectorCount register \r
-  LbaAddress - The LBA address in 48-bit mode\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS      - Reading succeed\r
-  EFI_ABORTED      - Command failed\r
-  EFI_DEVICE_ERROR - Device status error\r
-\r
---*/\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       StatusRegister;\r
@@ -1872,26 +1685,20 @@ Returns:
 //\r
 // SetDriveParameters\r
 //\r
+/**\r
+  Set drive parameters for devices not support PACKETS command\r
+\r
+  @param[in] IdeDev       Standard IDE device private data structure\r
+  @param[in] DriveParameters The device parameters to be set into the disk\r
+\r
+  @return SetParameters Command execute status\r
+\r
+**/\r
 EFI_STATUS\r
 SetDriveParameters (\r
   IN IDE_BLK_IO_DEV       *IdeDev,\r
   IN ATA_DRIVE_PARMS      *DriveParameters\r
   )\r
-/*++\r
-Routine Description: \r
-\r
-  Set drive parameters for devices not support PACKETS command\r
-\r
-Arguments:\r
-\r
-  IdeDev       --  Standard IDE device private data structure\r
-  DriveParameters --  The device parameters to be set into the disk\r
-\r
-Returns:\r
-\r
-  SetParameters Command execute status\r
-    \r
---*/\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       DeviceSelect;\r
@@ -1932,25 +1739,18 @@ Returns:
   return Status;\r
 }\r
 \r
-EFI_STATUS\r
-EnableInterrupt (\r
-  IN IDE_BLK_IO_DEV       *IdeDev\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   TODO: Add function description\r
 \r
-Arguments:\r
-\r
-  IdeDev  - TODO: add argument description\r
+  @param  IdeDev TODO: add argument description\r
 \r
-Returns:\r
+  @retval  EFI_SUCCESS TODO: Add description for return value\r
 \r
-  EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
+**/\r
+EFI_STATUS\r
+EnableInterrupt (\r
+  IN IDE_BLK_IO_DEV       *IdeDev\r
+  )\r
 {\r
   UINT8 DeviceControl;\r
 \r