ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

bsmaster.h
Go to the documentation of this file.
00001 /*++
00002 
00003 Copyright (c) 2002-2011 Alexandr A. Telyatnikov (Alter)
00004 
00005 Module Name:
00006     bsmaster.h
00007 
00008 Abstract:
00009     This file contains DMA/UltraDMA and IDE BusMastering related definitions,
00010     internal structures and useful macros
00011 
00012 Author:
00013     Alexander A. Telyatnikov (Alter)
00014 
00015 Environment:
00016     kernel mode only
00017 
00018 Notes:
00019 
00020     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00021     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00022     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00023     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00024     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00025     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00026     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00027     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00028     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00029     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00030 
00031 Revision History:
00032 
00033     Code was created by
00034          Alter, Copyright (c) 2002-2008
00035 
00036     Some definitions were taken from FreeBSD 4.3-4.6 ATA driver by
00037          Søren Schmidt, Copyright (c) 1998,1999,2000,2001
00038 
00039 --*/
00040 
00041 #ifndef __IDE_BUSMASTER_H__
00042 #define __IDE_BUSMASTER_H__
00043 
00044 #include "config.h"
00045 
00046 #include "tools.h"
00047 
00048 //
00049 //
00050 //
00051 #define         ATA_IDLE                0x0
00052 #define         ATA_IMMEDIATE           0x1
00053 #define         ATA_WAIT_INTR           0x2
00054 #define         ATA_WAIT_READY          0x3
00055 #define         ATA_ACTIVE              0x4
00056 #define         ATA_ACTIVE_ATA          0x5
00057 #define         ATA_ACTIVE_ATAPI        0x6
00058 #define         ATA_REINITING           0x7
00059 #define         ATA_WAIT_BASE_READY     0x8
00060 #define         ATA_WAIT_IDLE           0x9
00061 
00062 
00063 #include "bm_devs.h"
00064 
00065 #include "uata_ctl.h"
00066 
00067 #define MAX_RETRIES                     6
00068 #define RETRY_UDMA2                     1
00069 #define RETRY_WDMA                      2
00070 #define RETRY_PIO                       3
00071 
00072 
00073 #define IO_WD1          0x1F0       /* Primary Fixed Disk Controller */
00074 #define IO_WD2          0x170       /* Secondary Fixed Disk Controller */
00075 #define IP_PC98_BANK    0x432
00076 
00077 #define PCI_ADDRESS_IOMASK              0xfffffff0
00078 
00079 #define ATA_BM_OFFSET1          0x08
00080 #define ATA_IOSIZE          0x08
00081 #define ATA_ALTOFFSET           0x206   /* alternate registers offset */
00082 #define ATA_PCCARD_ALTOFFSET        0x0e    /* do for PCCARD devices */
00083 #define ATA_ALTIOSIZE           0x01    /* alternate registers size */
00084 #define ATA_BMIOSIZE            0x20
00085 #define ATA_PC98_BANKIOSIZE             0x01
00086 //#define ATA_MAX_LBA28                   DEF_U64(0x0fffffff)
00087 // Hitachi 1 Tb HDD didn't allow LBA28 with BCount > 1 beyond this LBA
00088 #define ATA_MAX_IOLBA28                 DEF_U64(0x0fffff80)
00089 #define ATA_MAX_LBA28                   DEF_U64(0x0fffffff)
00090 
00091 #define ATA_DMA_ENTRIES         256     /* PAGESIZE/2/sizeof(BM_DMA_ENTRY)*/
00092 #define ATA_DMA_EOT         0x80000000
00093 
00094 #define DEV_BSIZE                       512
00095 
00096 #define ATAPI_MAGIC_LSB         0x14
00097 #define ATAPI_MAGIC_MSB         0xeb
00098 
00099 #define AHCI_MAX_PORT                   32
00100 
00101 #define SATA_MAX_PM_UNITS               16
00102 
00103 typedef struct _BUSMASTER_CTX {
00104     PBUSMASTER_CONTROLLER_INFORMATION* BMListPtr;
00105     ULONG* BMListLen;
00106 } BUSMASTER_CTX, *PBUSMASTER_CTX;
00107 
00108 #define PCI_DEV_CLASS_STORAGE           0x01
00109 
00110 #define PCI_DEV_SUBCLASS_IDE            0x01
00111 #define PCI_DEV_SUBCLASS_RAID           0x04
00112 #define PCI_DEV_SUBCLASS_ATA            0x05
00113 #define PCI_DEV_SUBCLASS_SATA           0x06
00114 
00115 #define PCI_DEV_PROGIF_AHCI_1_0         0x01
00116 
00117 /* structure for holding DMA address data */
00118 typedef struct BM_DMA_ENTRY {
00119     ULONG base;
00120     ULONG count;
00121 } BM_DMA_ENTRY, *PBM_DMA_ENTRY;
00122 
00123 typedef struct _IDE_BUSMASTER_REGISTERS {
00124     UCHAR Command;
00125     UCHAR DeviceSpecific0;
00126     UCHAR Status;
00127     UCHAR DeviceSpecific1;
00128     ULONG PRD_Table;
00129 } IDE_BUSMASTER_REGISTERS, *PIDE_BUSMASTER_REGISTERS;
00130 
00131 #define BM_STATUS_ACTIVE                0x01
00132 #define BM_STATUS_ERR                   0x02
00133 #define BM_STATUS_INTR                  0x04
00134 #define BM_STATUS_MASK                  0x07
00135 #define BM_STATUS_DRIVE_0_DMA           0x20
00136 #define BM_STATUS_DRIVE_1_DMA           0x40
00137 #define BM_STATUS_SIMPLEX_ONLY          0x80
00138 
00139 #define BM_COMMAND_START_STOP       0x01
00140 /*#define BM_COMMAND_WRITE      0x08
00141 #define BM_COMMAND_READ             0x00*/
00142 #define BM_COMMAND_WRITE        0x00
00143 #define BM_COMMAND_READ             0x08
00144 
00145 #define BM_DS0_SII_DMA_ENABLE           (1 << 0)  /* DMA run switch */
00146 #define BM_DS0_SII_IRQ                  (1 << 3)  /* ??? */
00147 #define BM_DS0_SII_DMA_SATA_IRQ         (1 << 4)  /* OR of all SATA IRQs */
00148 #define BM_DS0_SII_DMA_ERROR            (1 << 17) /* PCI bus error */
00149 #define BM_DS0_SII_DMA_COMPLETE         (1 << 18) /* cmd complete / IRQ pending */
00150 
00151 
00152 #define IDX_BM_IO                       (IDX_IO2_o+IDX_IO2_o_SZ)
00153 //#define IDX_BM_IO_SZ                    sizeof(IDE_BUSMASTER_REGISTERS)
00154 #define IDX_BM_IO_SZ                    5
00155 
00156 #define IDX_BM_Command                  (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, Command        )+IDX_BM_IO)
00157 #define IDX_BM_DeviceSpecific0          (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific0)+IDX_BM_IO)
00158 #define IDX_BM_Status                   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, Status         )+IDX_BM_IO)
00159 #define IDX_BM_DeviceSpecific1          (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific1)+IDX_BM_IO)
00160 #define IDX_BM_PRD_Table                (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, PRD_Table      )+IDX_BM_IO)
00161 
00162 typedef struct _IDE_AHCI_REGISTERS {
00163     // HBA Capabilities
00164     struct {
00165         ULONG NOP:5;   // number of ports
00166         ULONG Reserved5_7:1;
00167         ULONG NCS:5;   // number of command slots
00168         ULONG PSC:1;   // partial state capable
00169         ULONG SSC:1;   // slumber state capable
00170         ULONG PMD:1;   // PIO multiple DRQ block
00171         ULONG Reserved16:1;
00172 
00173         ULONG SPM:1;   // port multiplier
00174         ULONG SAM:1;   // AHCI mode only
00175         ULONG SNZO:1;  // non-zero DMA offset
00176         ULONG ISS:4;   // interface speed
00177         ULONG SCLO:1;  // command list override
00178         ULONG SAL:1;   // activity LED
00179         ULONG SALP:1;  // aggressive link power management
00180         ULONG SSS:1;   // staggered spin-up
00181         ULONG SIS:1;   // interlock switch
00182         ULONG Reserved29:1;
00183         ULONG SNCQ:1;  // native command queue
00184         ULONG S64A:1;  // 64bit addr
00185     } CAP;
00186 
00187 #define AHCI_CAP_NOP_MASK    0x0000001f
00188 #define AHCI_CAP_NCS_MASK    0x00001f00
00189 #define AHCI_CAP_PMD         0x00008000
00190 #define AHCI_CAP_SPM         0x00020000
00191 #define AHCI_CAP_SAM         0x00040000
00192 #define AHCI_CAP_SCLO        0x01000000
00193 #define AHCI_CAP_S64A        0x80000000
00194 
00195     // Global HBA Control
00196     struct {
00197         ULONG HR:1;    // HBA Reset
00198         ULONG IE:1;    // interrupt enable
00199         ULONG Reserved2_30:1;
00200         ULONG AE:1;    // AHCI enable
00201     } GHC;
00202 
00203 #define AHCI_GHC   0x04
00204 #define AHCI_GHC_HR    0x00000001
00205 #define AHCI_GHC_IE    0x00000002
00206 #define AHCI_GHC_AE    0x80000000
00207 
00208     // Interrupt status (bit mask)
00209     ULONG IS;
00210     // Ports implemented (bit mask)
00211     ULONG PI;
00212     // AHCI Version
00213     ULONG VS;
00214     ULONG Reserved[3];
00215 
00216     UCHAR Reserved2[0x80];
00217 
00218     UCHAR VendorSpec[0x60];
00219 } IDE_AHCI_REGISTERS, *PIDE_AHCI_REGISTERS;
00220 
00221 #define IDX_AHCI_CAP                    (FIELD_OFFSET(IDE_AHCI_REGISTERS, CAP))
00222 #define IDX_AHCI_GHC                    (FIELD_OFFSET(IDE_AHCI_REGISTERS, GHC))
00223 #define IDX_AHCI_IS                     (FIELD_OFFSET(IDE_AHCI_REGISTERS, IS))
00224 #define IDX_AHCI_VS                     (FIELD_OFFSET(IDE_AHCI_REGISTERS, VS))
00225 #define IDX_AHCI_PI                     (FIELD_OFFSET(IDE_AHCI_REGISTERS, PI))
00226 
00227 
00228 typedef union _SATA_SSTATUS_REG {
00229 
00230     struct {
00231         ULONG DET:4; // Device Detection
00232 
00233 #define SStatus_DET_NoDev        0x00
00234 #define SStatus_DET_Dev_NoPhy    0x01
00235 #define SStatus_DET_Dev_Ok       0x03
00236 #define SStatus_DET_Offline      0x04
00237 
00238         ULONG SPD:4; // Current Interface Speed
00239 
00240 #define SStatus_SPD_NoDev        0x00
00241 #define SStatus_SPD_Gen1         0x01
00242 #define SStatus_SPD_Gen2         0x02
00243 #define SStatus_SPD_Gen3         0x03
00244 
00245         ULONG IPM:4; // Interface Power Management
00246 
00247 #define SStatus_IPM_NoDev        0x00
00248 #define SStatus_IPM_Active       0x01
00249 #define SStatus_IPM_Partial      0x02
00250 #define SStatus_IPM_Slumber      0x06
00251 
00252         ULONG Reserved:20;
00253     };
00254     ULONG Reg;
00255 
00256 } SATA_SSTATUS_REG, *PSATA_SSTATUS_REG;
00257 
00258 
00259 typedef union _SATA_SCONTROL_REG {
00260 
00261     struct {
00262         ULONG DET:4; // Device Detection Init
00263 
00264 #define SControl_DET_DoNothing   0x00
00265 #define SControl_DET_Idle        0x00
00266 #define SControl_DET_Init        0x01
00267 #define SControl_DET_Disable     0x04
00268 
00269         ULONG SPD:4; // Speed Allowed
00270 
00271 #define SControl_SPD_NoRestrict  0x00
00272 #define SControl_SPD_LimGen1     0x01
00273 #define SControl_SPD_LimGen2     0x02
00274 #define SControl_SPD_LimGen3     0x03
00275 
00276         ULONG IPM:4; // Interface Power Management Transitions Allowed
00277 
00278 #define SControl_IPM_NoRestrict  0x00
00279 #define SControl_IPM_NoPartial   0x01
00280 #define SControl_IPM_NoSlumber   0x02
00281 #define SControl_IPM_NoPartialSlumber 0x03
00282 
00283         ULONG SPM:4; // Select Power Management, unused by AHCI
00284         ULONG PMP:4; // Port Multiplier Port, unused by AHCI
00285         ULONG Reserved:12;
00286     };
00287     ULONG Reg;
00288 
00289 } SATA_SCONTROL_REG, *PSATA_SCONTROL_REG;
00290 
00291 
00292 typedef union _SATA_SERROR_REG {
00293 
00294     struct {
00295         struct {
00296             UCHAR I:1; // Recovered Data Integrity Error
00297             UCHAR M:1; // Recovered Communications Error
00298             UCHAR Reserved_2_7:6;
00299 
00300             UCHAR T:1; // Transient Data Integrity Error
00301             UCHAR C:1; // Persistent Communication or Data Integrity Error
00302             UCHAR P:1; // Protocol Error
00303             UCHAR E:1; // Internal Error
00304             UCHAR Reserved_12_15:4;
00305         } ERR;
00306 
00307         struct {
00308             UCHAR N:1; // PhyRdy Change, PIS.PRCS
00309             UCHAR I:1; // Phy Internal Error
00310             UCHAR W:1; // Comm Wake
00311             UCHAR B:1; // 10B to 8B Decode Error
00312             UCHAR D:1; // Disparity Error, not used by AHCI
00313             UCHAR C:1; // CRC Error
00314             UCHAR H:1; // Handshake Error
00315             UCHAR S:1; // Link Sequence Error
00316 
00317             UCHAR T:1; // Transport state transition error
00318             UCHAR F:1; // Unknown FIS Type
00319             UCHAR X:1; // Exchanged
00320             UCHAR Reserved_27_31:5;
00321         } DIAG;
00322     };
00323     ULONG Reg;
00324 
00325 } SATA_SERROR_REG, *PSATA_SERROR_REG;
00326 
00327 
00328 typedef struct _IDE_SATA_REGISTERS {
00329     union {
00330         SATA_SSTATUS_REG   SStatus;
00331         ULONG              SStatus_Reg;
00332     };
00333     union {
00334         SATA_SERROR_REG    SError;
00335         ULONG              SError_Reg;
00336     };
00337     union {
00338         SATA_SCONTROL_REG  SControl;
00339         ULONG              SControl_Reg;
00340     };
00341 
00342     // SATA 1.2
00343 
00344     ULONG                  SActive;
00345     union {
00346         ULONG Reg;
00347         struct {
00348             USHORT PMN;     // PM Notify, bitmask
00349             USHORT Reserved;
00350         };
00351     } SNTF;
00352     ULONG                  SReserved[11];
00353 } IDE_SATA_REGISTERS, *PIDE_SATA_REGISTERS;
00354 
00355 #define IDX_SATA_IO                     (IDX_BM_IO+IDX_BM_IO_SZ)
00356 //#define IDX_SATA_IO_SZ                  sizeof(IDE_SATA_REGISTERS)
00357 #define IDX_SATA_IO_SZ                  5
00358 
00359 #define IDX_SATA_SStatus                (0+IDX_SATA_IO)
00360 #define IDX_SATA_SError                 (1+IDX_SATA_IO)
00361 #define IDX_SATA_SControl               (2+IDX_SATA_IO)
00362 #define IDX_SATA_SActive                (3+IDX_SATA_IO)
00363 #define IDX_SATA_SNTF_PMN               (4+IDX_SATA_IO)
00364 
00365 #define IDX_INDEXED_IO                  (IDX_SATA_IO+IDX_SATA_IO_SZ)
00366 #define IDX_INDEXED_IO_SZ               2
00367 
00368 #define IDX_INDEXED_ADDR                (0+IDX_INDEXED_IO)
00369 #define IDX_INDEXED_DATA                (1+IDX_INDEXED_IO)
00370 
00371 #define IDX_MAX_REG                     (IDX_INDEXED_IO+IDX_INDEXED_IO_SZ)
00372 
00373 
00374 typedef union _AHCI_IS_REG {
00375     struct {
00376         ULONG DHRS:1;// Device to Host Register FIS Interrupt
00377         ULONG PSS:1; // PIO Setup FIS Interrupt
00378         ULONG DSS:1; // DMA Setup FIS Interrupt
00379         ULONG SDBS:1;// Set Device Bits Interrupt
00380         ULONG UFS:1; // Unknown FIS Interrupt
00381         ULONG DPS:1; // Descriptor Processed
00382         ULONG PCS:1; // Port Connect Change Status
00383         ULONG DMPS:1;// Device Mechanical Presence Status
00384 
00385         ULONG Reserved_8_21:14;
00386         ULONG PRCS:1;// PhyRdy Change Status
00387         ULONG IPMS:1;// Incorrect Port Multiplier Status
00388 
00389         ULONG OFS:1; // Overflow Status
00390         ULONG Reserved_25:1;
00391         ULONG INFS:1;// Interface Non-fatal Error Status
00392         ULONG IFS:1; // Interface Fatal Error Status
00393         ULONG HBDS:1;// Host Bus Data Error Status
00394         ULONG HBFS:1;// Host Bus Fatal Error Status
00395         ULONG TFES:1;// Task File Error Status
00396         ULONG CPDS:1;// Cold Port Detect Status
00397     };
00398     ULONG Reg;
00399 } AHCI_IS_REG, *PAHCI_IS_REG;
00400 
00401 #define         ATA_AHCI_P_IX_DHR       0x00000001
00402 #define         ATA_AHCI_P_IX_PS        0x00000002
00403 #define         ATA_AHCI_P_IX_DS        0x00000004
00404 #define         ATA_AHCI_P_IX_SDB       0x00000008
00405 #define         ATA_AHCI_P_IX_UF        0x00000010
00406 #define         ATA_AHCI_P_IX_DP        0x00000020
00407 #define         ATA_AHCI_P_IX_PC        0x00000040
00408 #define         ATA_AHCI_P_IX_DI        0x00000080
00409 
00410 #define         ATA_AHCI_P_IX_PRC       0x00400000
00411 #define         ATA_AHCI_P_IX_IPM       0x00800000
00412 #define         ATA_AHCI_P_IX_OF        0x01000000
00413 #define         ATA_AHCI_P_IX_INF       0x04000000
00414 #define         ATA_AHCI_P_IX_IF        0x08000000
00415 #define         ATA_AHCI_P_IX_HBD       0x10000000
00416 #define         ATA_AHCI_P_IX_HBF       0x20000000
00417 #define         ATA_AHCI_P_IX_TFE       0x40000000
00418 #define         ATA_AHCI_P_IX_CPD       0x80000000
00419 
00420 #define AHCI_CLB_ALIGNEMENT_MASK    ((ULONGLONG)(1024-1))
00421 #define AHCI_FIS_ALIGNEMENT_MASK    ((ULONGLONG)(256-1))
00422 #define AHCI_CMD_ALIGNEMENT_MASK    ((ULONGLONG)(128-1))
00423 
00424 typedef struct _IDE_AHCI_PORT_REGISTERS {
00425     union {
00426         struct {
00427             ULONG  CLB;   // command list base address, 1K-aligned
00428             ULONG  CLBU;  // command list base address (upper 32bits)
00429         };
00430         ULONGLONG CLB64;
00431     };  // 0x100 + 0x80*c + 0x0000
00432 
00433     union {
00434         struct {
00435             ULONG  FB;   // FIS base address
00436             ULONG  FBU;  // FIS base address (upper 32bits)
00437         };
00438         ULONGLONG FB64;
00439     };  // 0x100 + 0x80*c + 0x0008
00440 
00441     union {
00442         ULONG       IS_Reg;            // interrupt status
00443         AHCI_IS_REG IS;
00444     };  // 0x100 + 0x80*c + 0x0010
00445 
00446     union {
00447         ULONG Reg;            // interrupt enable
00448         struct {
00449             ULONG DHRE:1;// Device to Host Register FIS Interrupt Enable
00450             ULONG PSE:1; // PIO Setup FIS Interrupt Enable
00451             ULONG DSE:1; // DMA Setup FIS Interrupt Enable
00452             ULONG SDBE:1;// Set Device Bits FIS Interrupt Enable
00453             ULONG UFE:1; // Unknown FIS Interrupt Enable
00454             ULONG DPE:1; // Descriptor Processed Interrupt Enable
00455             ULONG PCE:1; // Port Change Interrupt Enable
00456             ULONG DPME:1;// Device Mechanical Presence Enable
00457 
00458             ULONG Reserved_8_21:14;
00459             ULONG PRCE:1;// PhyRdy Change Interrupt Enable
00460             ULONG IPME:1;// Incorrect Port Multiplier Enable
00461             ULONG OFE:1; // Overflow Enable
00462             ULONG Reserved_25:1;
00463             ULONG INFE:1;// Interface Non-fatal Error Enable
00464             ULONG IFE:1; // Interface Fatal Error Enable
00465             ULONG HBDE:1;// Host Bus Data Error Enable
00466             ULONG HBFE:1;// Host Bus Fatal Error Enable
00467             ULONG TFEE:1;// Task File Error Enable
00468             ULONG CPDE:1;// Cold Port Detect Enable
00469         };
00470     } IE;  // 0x100 + 0x80*c + 0x0014
00471 
00472     union {
00473         ULONG Reg;           // command register
00474         struct {
00475 
00476             ULONG ST:1;  // Start
00477             ULONG SUD:1; // Spin-Up Device
00478             ULONG POD:1; // Power On Device
00479             ULONG CLO:1; // Command List Override
00480             ULONG FRE:1; // FIS Receive Enable
00481             ULONG Reserved_5_7:3;
00482 
00483             ULONG CCS:5; // Current Command Slot
00484             ULONG MPSS:1;// Mechanical Presence Switch State
00485             ULONG FR:1;  // FIS Receive Running
00486             ULONG CR:1;  // Command List Running
00487 
00488             ULONG CPS:1; // Cold Presence State
00489             ULONG PMA:1; // Port Multiplier Attached
00490             ULONG HPCP:1;// Hot Plug Capable Port
00491             ULONG MPSP:1;// Mechanical Presence Switch Attached to Port
00492             ULONG CPD:1; // Cold Presence Detection
00493             ULONG ESP:1; // External SATA Port
00494             ULONG Reserved_22_23:2;
00495 
00496             ULONG ATAPI:1; // Device is ATAPI
00497             ULONG DLAE:1;// Drive LED on ATAPI Enable
00498             ULONG ALPE:1;// Aggressive Link Power Management Enable
00499             ULONG ASP:1; // Aggressive Slumber / Partial
00500             ULONG ICC:4; // Interface Communication Control
00501 
00502 #define SATA_CMD_ICC_Idle    0x00
00503 #define SATA_CMD_ICC_NoOp    0x00
00504 #define SATA_CMD_ICC_Active  0x01
00505 #define SATA_CMD_ICC_Partial 0x02
00506 #define SATA_CMD_ICC_Slumber 0x06
00507         };
00508     } CMD;  // 0x100 + 0x80*c + 0x0018
00509 
00510     ULONG Reserved;
00511 
00512     union {
00513         ULONG Reg;           // Task File Data
00514         struct {
00515             struct {
00516                 UCHAR ERR:1;
00517                 UCHAR cs1:2;// command-specific
00518                 UCHAR DRQ:1;
00519                 UCHAR cs2:3;// command-specific
00520                 UCHAR BSY:1;
00521             } STS;
00522             UCHAR ERR; // Contains the latest copy of the task file error register.
00523             UCHAR Reserved[2];
00524         };
00525     } TFD;  // 0x100 + 0x80*c + 0x0020
00526 
00527     union {
00528         ULONG Reg;           // signature
00529         struct {
00530             UCHAR SectorCount;
00531             UCHAR LbaLow;
00532             UCHAR LbaMid;
00533             UCHAR LbaHigh;
00534         };
00535     } SIG;  // 0x100 + 0x80*c + 0x0024
00536     union {
00537         ULONG             SStatus;      // SCR0
00538         SATA_SSTATUS_REG  SSTS;
00539     };  // 0x100 + 0x80*c + 0x0028
00540     union {
00541         ULONG             SControl;     // SCR2
00542         SATA_SCONTROL_REG SCTL;
00543     };  // 0x100 + 0x80*c + 0x002c
00544     union {
00545         ULONG             SError;       // SCR1
00546         SATA_SERROR_REG   SERR;
00547     };  // 0x100 + 0x80*c + 0x0030
00548     union {
00549         ULONG SACT;      // SCR3
00550         ULONG SActive;   // bitmask
00551     };  // 0x100 + 0x80*c + 0x0034
00552 
00553     ULONG CI;            // Command issue, bitmask,   0x100 + 0x80*c + 0x0038
00554 
00555     // AHCI 1.1
00556     union {
00557         ULONG Reg;
00558         struct {
00559             USHORT PMN;     // PM Notify, bitmask
00560             USHORT Reserved;
00561         };
00562     } SNTF;  // 0x100 + 0x80*c + 0x003c
00563 
00564     ULONG FIS_Switching_Reserved[12];
00565     UCHAR VendorSpec[16];
00566 
00567 } IDE_AHCI_PORT_REGISTERS, *PIDE_AHCI_PORT_REGISTERS;
00568 
00569 #define IDX_AHCI_P_CLB                    (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CLB))
00570 #define IDX_AHCI_P_FB                     (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, FB))
00571 #define IDX_AHCI_P_IS                     (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IS))
00572 #define IDX_AHCI_P_IE                     (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IE))
00573 #define IDX_AHCI_P_CI                     (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CI))
00574 #define IDX_AHCI_P_TFD                    (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD))
00575 #define IDX_AHCI_P_SIG                    (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG))
00576 #define IDX_AHCI_P_CMD                    (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CMD))
00577 
00578 #define IDX_AHCI_P_SNTF                   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SNTF))
00579 
00580 // AHCI commands ( -> IDX_AHCI_P_CMD)
00581 #define         ATA_AHCI_P_CMD_ST       0x00000001
00582 #define         ATA_AHCI_P_CMD_SUD      0x00000002
00583 #define         ATA_AHCI_P_CMD_POD      0x00000004
00584 #define         ATA_AHCI_P_CMD_CLO      0x00000008
00585 #define         ATA_AHCI_P_CMD_FRE      0x00000010
00586 #define         ATA_AHCI_P_CMD_CCS_MASK 0x00001f00
00587 #define         ATA_AHCI_P_CMD_ISS      0x00002000
00588 #define         ATA_AHCI_P_CMD_FR       0x00004000
00589 #define         ATA_AHCI_P_CMD_CR       0x00008000
00590 #define         ATA_AHCI_P_CMD_CPS      0x00010000
00591 #define         ATA_AHCI_P_CMD_PMA      0x00020000
00592 #define         ATA_AHCI_P_CMD_HPCP     0x00040000
00593 #define         ATA_AHCI_P_CMD_ISP      0x00080000
00594 #define         ATA_AHCI_P_CMD_CPD      0x00100000
00595 #define         ATA_AHCI_P_CMD_ATAPI    0x01000000
00596 #define         ATA_AHCI_P_CMD_DLAE     0x02000000
00597 #define         ATA_AHCI_P_CMD_ALPE     0x04000000
00598 #define         ATA_AHCI_P_CMD_ASP      0x08000000
00599 #define         ATA_AHCI_P_CMD_ICC_MASK 0xf0000000
00600 #define         ATA_AHCI_P_CMD_NOOP     0x00000000
00601 #define         ATA_AHCI_P_CMD_ACTIVE   0x10000000
00602 #define         ATA_AHCI_P_CMD_PARTIAL  0x20000000
00603 #define         ATA_AHCI_P_CMD_SLUMBER  0x60000000
00604 
00605 
00606 typedef struct _IDE_AHCI_PRD_ENTRY {
00607     union {
00608         ULONG base;
00609         ULONGLONG base64;
00610         struct {
00611             ULONG DBA;
00612             union {
00613                 ULONG DBAU;
00614                 ULONG baseu;
00615             };
00616         };
00617     };
00618     ULONG Reserved1;
00619 
00620     ULONG DBC:22;
00621     ULONG Reserved2:9;
00622     ULONG I:1;
00623 
00624 } IDE_AHCI_PRD_ENTRY, *PIDE_AHCI_PRD_ENTRY;
00625 
00626 #define ATA_AHCI_DMA_ENTRIES        (PAGE_SIZE/2/sizeof(IDE_AHCI_PRD_ENTRY))   /* 128 */
00627 #define ATA_AHCI_MAX_TAGS       32
00628 
00629 #define AHCI_FIS_TYPE_ATA_H2D           0x27
00630 #define AHCI_FIS_TYPE_ATA_D2H           0x34
00631 
00632 #define AHCI_FIS_COMM_PM                (0x80 | AHCI_DEV_SEL_PM)
00633 
00634 #define AHCI_DEV_SEL_1                  0x00
00635 #define AHCI_DEV_SEL_2                  0x01
00636 #define AHCI_DEV_SEL_PM                 0x0f
00637 
00638 /* 128-byte aligned */
00639 typedef struct _IDE_AHCI_CMD {
00640     UCHAR              cfis[64];
00641     UCHAR              acmd[32];
00642     UCHAR              Reserved[32];
00643     IDE_AHCI_PRD_ENTRY prd_tab[ATA_AHCI_DMA_ENTRIES]; // also 128-byte aligned
00644 } IDE_AHCI_CMD, *PIDE_AHCI_CMD;
00645 
00646 
00647 /* cmd_flags */
00648 #define ATA_AHCI_CMD_ATAPI      0x0020
00649 #define ATA_AHCI_CMD_WRITE      0x0040
00650 #define ATA_AHCI_CMD_PREFETCH       0x0080
00651 #define ATA_AHCI_CMD_RESET      0x0100
00652 #define ATA_AHCI_CMD_BIST       0x0200
00653 #define ATA_AHCI_CMD_CLR_BUSY       0x0400
00654 
00655 /* 128-byte aligned */
00656 typedef struct _IDE_AHCI_CMD_LIST {
00657     USHORT             cmd_flags;
00658     USHORT             prd_length;     /* PRD entries */
00659     ULONG              bytecount;
00660     ULONGLONG          cmd_table_phys; /* points to IDE_AHCI_CMD */
00661     ULONG              Reserved[4];
00662 } IDE_AHCI_CMD_LIST, *PIDE_AHCI_CMD_LIST;
00663 
00664 /* 256-byte aligned */
00665 typedef struct _IDE_AHCI_RCV_FIS {
00666     UCHAR              dsfis[28];
00667     UCHAR              Reserved1[4];
00668     UCHAR              psfis[24];
00669     UCHAR              Reserved2[8];
00670     UCHAR              rfis[24];
00671     UCHAR              Reserved3[4];
00672     ULONG              SDBFIS;
00673     UCHAR              ufis[64];
00674     UCHAR              Reserved4[96];
00675 } IDE_AHCI_RCV_FIS, *PIDE_AHCI_RCV_FIS;
00676 
00677 /* 1K-byte aligned */
00678 typedef struct _IDE_AHCI_CHANNEL_CTL_BLOCK {
00679     IDE_AHCI_CMD_LIST  cmd_list[ATA_AHCI_MAX_TAGS]; // 1K-size (32*32)
00680     IDE_AHCI_RCV_FIS   rcv_fis;
00681     IDE_AHCI_CMD       cmd; // for single internal comamnds w/o associated AtaReq
00682 } IDE_AHCI_CHANNEL_CTL_BLOCK, *PIDE_AHCI_CHANNEL_CTL_BLOCK;
00683 
00684 
00685 #define IsBusMaster(pciData) \
00686     ( ((pciData)->Command & (PCI_ENABLE_BUS_MASTER/* | PCI_ENABLE_IO_SPACE*/)) == \
00687           (PCI_ENABLE_BUS_MASTER/* | PCI_ENABLE_IO_SPACE*/))
00688 
00689 #define PCI_IDE_PROGIF_NATIVE_1         0x01
00690 #define PCI_IDE_PROGIF_NATIVE_2         0x04
00691 #define PCI_IDE_PROGIF_NATIVE_ALL       0x05
00692 
00693 #define IsMasterDev(pciData) \
00694     ( ((pciData)->ProgIf & 0x80) && \
00695       ((pciData)->ProgIf & PCI_IDE_PROGIF_NATIVE_ALL) != PCI_IDE_PROGIF_NATIVE_ALL )
00696 
00697 //#define INT_Q_SIZE 32
00698 #define MIN_REQ_TTL 4
00699 
00700 union _ATA_REQ;
00701 
00702 typedef union _ATA_REQ {
00703 //    ULONG               reqId;          // serial
00704     struct {
00705 
00706         //union {
00707 
00708         struct {
00709             union _ATA_REQ*     next_req;
00710             union _ATA_REQ*     prev_req;
00711 
00712             PSCSI_REQUEST_BLOCK Srb;            // Current request on controller.
00713 
00714             PUSHORT             DataBuffer;     // Data buffer pointer.
00715             ULONG               WordsLeft;      // Data words left.
00716             ULONG               TransferLength; // Originally requested transfer length
00717             LONGLONG            lba;
00718             ULONG               WordsTransfered;// Data words already transfered.
00719             ULONG               bcount;
00720 
00721             UCHAR               retry;
00722             UCHAR               ttl;
00723         //    UCHAR               tag;
00724             UCHAR               Flags;
00725             UCHAR               ReqState;
00726 
00727             PSCSI_REQUEST_BLOCK OriginalSrb;    // Mechanism Status Srb Data
00728 
00729             ULONG               dma_entries;
00730             union {
00731                 // for ATA
00732                 struct {
00733                     ULONG           dma_base;
00734                     ULONG           dma_baseu;
00735                 } ata;
00736                 // for AHCI
00737                 struct {
00738                     ULONGLONG       ahci_base64;
00739                     ULONGLONG       in_lba;
00740                     PIDE_AHCI_CMD   ahci_cmd_ptr;
00741                     ULONG           in_bcount;
00742                     ULONG           in_status;
00743                     USHORT          io_cmd_flags; // out
00744 
00745                 } ahci;
00746             };
00747         };
00748             //UCHAR padding_128b[128];  // Note: we assume, NT allocates block > 4k as PAGE-aligned
00749         //};
00750         struct {
00751             union {
00752                 BM_DMA_ENTRY    dma_tab[ATA_DMA_ENTRIES];
00753                 IDE_AHCI_CMD    ahci_cmd0;       // for AHCI, 128-byte aligned
00754             };
00755         };
00756     };
00757 
00758     UCHAR padding_4kb[PAGE_SIZE];
00759 
00760 } ATA_REQ, *PATA_REQ;
00761 
00762 #define REQ_FLAG_FORCE_DOWNRATE         0x01
00763 #define REQ_FLAG_DMA_OPERATION          0x02
00764 #define REQ_FLAG_REORDERABLE_CMD        0x04
00765 #define REQ_FLAG_RW_MASK                0x08
00766 #define     REQ_FLAG_READ                   0x08
00767 #define     REQ_FLAG_WRITE                  0x00
00768 #define REQ_FLAG_FORCE_DOWNRATE_LBA48   0x10
00769 #define REQ_FLAG_DMA_DBUF               0x20
00770 #define REQ_FLAG_DMA_DBUF_PRD           0x40
00771 #define REQ_FLAG_LBA48                  0x80
00772 
00773 // Request states
00774 #define REQ_STATE_NONE                  0x00
00775 #define REQ_STATE_QUEUED                0x10
00776 
00777 #define REQ_STATE_PREPARE_TO_TRANSFER   0x20
00778 #define REQ_STATE_PREPARE_TO_NEXT       0x21
00779 #define REQ_STATE_READY_TO_TRANSFER     0x30
00780 
00781 #define REQ_STATE_EXPECTING_INTR        0x40
00782 #define REQ_STATE_ATAPI_EXPECTING_CMD_INTR     0x41
00783 #define REQ_STATE_ATAPI_EXPECTING_DATA_INTR    0x42
00784 #define REQ_STATE_ATAPI_DO_NOTHING_INTR        0x43
00785 
00786 #define REQ_STATE_EARLY_INTR            0x48
00787 
00788 #define REQ_STATE_PROCESSING_INTR       0x50
00789 
00790 #define REQ_STATE_DPC_INTR_REQ          0x51
00791 #define REQ_STATE_DPC_RESET_REQ         0x52
00792 #define REQ_STATE_DPC_COMPLETE_REQ      0x53
00793 
00794 #define REQ_STATE_DPC_WAIT_BUSY0        0x57
00795 #define REQ_STATE_DPC_WAIT_BUSY1        0x58
00796 #define REQ_STATE_DPC_WAIT_BUSY         0x59
00797 #define REQ_STATE_DPC_WAIT_DRQ          0x5a
00798 #define REQ_STATE_DPC_WAIT_DRQ0         0x5b
00799 #define REQ_STATE_DPC_WAIT_DRQ_ERR      0x5c
00800 
00801 #define REQ_STATE_TRANSFER_COMPLETE     0x7f
00802 
00803 // Command actions:
00804 #define CMD_ACTION_PREPARE              0x01
00805 #define CMD_ACTION_EXEC                 0x02
00806 #define CMD_ACTION_ALL                  (CMD_ACTION_PREPARE | CMD_ACTION_EXEC)
00807 
00808 // predefined Reorder costs
00809 #define REORDER_COST_MAX               ((DEF_I64(0x1) << 60) - 1)
00810 #define REORDER_COST_TTL               (REORDER_COST_MAX - 1)
00811 #define REORDER_COST_INTERSECT         (REORDER_COST_MAX - 2)
00812 #define REORDER_COST_DENIED            (REORDER_COST_MAX - 3)
00813 #define REORDER_COST_RESELECT          (REORDER_COST_MAX/4)
00814 
00815 #define REORDER_COST_SWITCH_RW_CD      (REORDER_COST_MAX/8)
00816 #define REORDER_MCOST_SWITCH_RW_CD     (0)
00817 #define REORDER_MCOST_SEEK_BACK_CD     (16)
00818 
00819 #define REORDER_COST_SWITCH_RW_HDD     (0)
00820 #define REORDER_MCOST_SWITCH_RW_HDD    (4)
00821 #define REORDER_MCOST_SEEK_BACK_HDD    (2)
00822 
00823 /*typedef struct _ATA_QUEUE {
00824     struct _ATA_REQ*    head_req; // index
00825     struct _ATA_REQ*    tail_req; // index
00826     ULONG               req_count;
00827     ULONG               dma_base;
00828     BM_DMA_ENTRY        dma_tab[ATA_DMA_ENTRIES];
00829 } ATA_QUEUE, *PATA_QUEUE;*/
00830 
00831 struct _HW_DEVICE_EXTENSION;
00832 struct _HW_LU_EXTENSION;
00833 
00834 typedef struct _IORES {
00835     ULONG Addr;          /* Base address*/
00836     ULONG MemIo:1;       /* Memory mapping (1) vs IO ports (0) */
00837     ULONG Proc:1;        /* Need special process via IO_Proc */
00838     ULONG Reserved:30;
00839 } IORES, *PIORES;
00840 
00841 // Channel extension
00842 typedef struct _HW_CHANNEL {
00843 
00844     PATA_REQ            cur_req;
00845     ULONG               cur_cdev;
00846 /*    PATA_REQ            first_req;
00847     PATA_REQ            last_req;*/
00848     ULONG               queue_depth;
00849     ULONG               ChannelSelectWaitCount;
00850 
00851     UCHAR               DpcState;
00852 
00853     BOOLEAN             ExpectingInterrupt;    // Indicates expecting an interrupt
00854     BOOLEAN             RDP;    // Indicate last tape command was DSC Restrictive.
00855     // Indicates whether '0x1f0' is the base address. Used
00856     // in SMART Ioctl calls.
00857     BOOLEAN             PrimaryAddress;
00858     // Placeholder for the sub-command value of the last
00859     // SMART command.
00860     UCHAR               SmartCommand;
00861     // Reorder anabled
00862     BOOLEAN             UseReorder;
00863     // Placeholder for status register after a GET_MEDIA_STATUS command
00864     UCHAR               ReturningMediaStatus;
00865 
00866     BOOLEAN             CopyDmaBuffer;
00867     //BOOLEAN             MemIo;
00868     BOOLEAN             AltRegMap;
00869 
00870     //UCHAR               Reserved[3];
00871 
00872     MECHANICAL_STATUS_INFORMATION_HEADER MechStatusData;
00873     SENSE_DATA          MechStatusSense;
00874     ULONG               MechStatusRetryCount;
00875     SCSI_REQUEST_BLOCK  InternalSrb;
00876 
00877     ULONG               MaxTransferMode; // may differ from Controller's value due to 40-pin cable
00878 
00879     ULONG               ChannelCtrlFlags;
00880     ULONG               ResetInProgress; // flag
00881     LONG                DisableIntr;
00882     LONG                CheckIntr;
00883 
00884     ULONG               lChannel;
00885 
00886 #define CHECK_INTR_ACTIVE               0x03
00887 #define CHECK_INTR_DETECTED             0x02
00888 #define CHECK_INTR_CHECK                0x01
00889 #define CHECK_INTR_IDLE                 0x00
00890 
00891     ULONG       NextDpcChan;
00892     PHW_TIMER   HwScsiTimer;
00893     LONGLONG    DpcTime;
00894 #if 0
00895     PHW_TIMER   HwScsiTimer1;
00896     PHW_TIMER   HwScsiTimer2;
00897     LONGLONG    DpcTime1;
00898 //    PHW_TIMER           CurDpc;
00899 //    LARGE_INTEGER       ActivationTime;
00900 
00901 //    KDPC                Dpc;
00902 //    KTIMER              Timer;
00903 //    PHW_TIMER           HwScsiTimer;
00904 //    KSPIN_LOCK          QueueSpinLock;
00905 //    KIRQL               QueueOldIrql;
00906 #endif
00907     struct _HW_DEVICE_EXTENSION* DeviceExtension;
00908     struct _HW_LU_EXTENSION* lun[IDE_MAX_LUN_PER_CHAN];
00909 
00910     ULONG   NumberLuns;
00911     ULONG   PmLunMap;
00912 
00913     // Double-buffering support
00914     PVOID   DB_PRD;
00915     ULONG   DB_PRD_PhAddr;
00916     PVOID   DB_IO;
00917     ULONG   DB_IO_PhAddr;
00918 
00919     PUCHAR  DmaBuffer;
00920 
00921     // 
00922     PIDE_AHCI_CHANNEL_CTL_BLOCK       AhciCtlBlock0; // unaligned
00923     PIDE_AHCI_CHANNEL_CTL_BLOCK       AhciCtlBlock;  // 128-byte aligned
00924     ULONGLONG                         AHCI_CTL_PhAddr;
00925     IORES                             BaseIoAHCI_Port;
00926     //PVOID                    AHCI_FIS;  // is not actually used by UniATA now, but is required by AHCI controller
00927     //ULONGLONG                AHCI_FIS_PhAddr;
00928     // Note: in contrast to FBSD, we keep PRD and CMD item in AtaReq structure 
00929 
00930 #ifdef QUEUE_STATISTICS
00931     LONGLONG QueueStat[MAX_QUEUE_STAT];
00932     LONGLONG ReorderCount;
00933     LONGLONG IntersectCount;
00934     LONGLONG TryReorderCount;
00935     LONGLONG TryReorderHeadCount;
00936     LONGLONG TryReorderTailCount; /* in-order requests */
00937 #endif //QUEUE_STATISTICS
00938 
00939     //ULONG BaseMemAddress;
00940     //ULONG BaseMemAddressOffset;
00941     IORES RegTranslation[IDX_MAX_REG];
00942 
00943 } HW_CHANNEL, *PHW_CHANNEL;
00944 
00945 #define CTRFLAGS_DMA_ACTIVE             0x0001
00946 #define CTRFLAGS_DMA_RO                 0x0002
00947 #define CTRFLAGS_DMA_OPERATION          0x0004
00948 #define CTRFLAGS_INTR_DISABLED          0x0008
00949 #define CTRFLAGS_DPC_REQ                0x0010
00950 #define CTRFLAGS_ENABLE_INTR_REQ        0x0020
00951 #define CTRFLAGS_LBA48                  0x0040
00952 #define CTRFLAGS_DSC_BSY                0x0080
00953 #define CTRFLAGS_NO_SLAVE               0x0100
00954 //#define CTRFLAGS_PATA                   0x0200
00955 #define CTRFLAGS_AHCI_PM                0x0400
00956 #define CTRFLAGS_AHCI_PM2               0x0800
00957 
00958 #define CTRFLAGS_PERMANENT  (CTRFLAGS_DMA_RO | CTRFLAGS_NO_SLAVE)
00959 
00960 #define GEOM_AUTO                       0xffffffff
00961 #define GEOM_STD                        0x0000
00962 #define GEOM_UNIATA                     0x0001
00963 #define GEOM_ORIG                       0x0002
00964 #define GEOM_MANUAL                     0x0003
00965 
00966 #define DPC_STATE_NONE                  0x00
00967 #define DPC_STATE_ISR                   0x10
00968 #define DPC_STATE_DPC                   0x20
00969 #define DPC_STATE_TIMER                 0x30
00970 #define DPC_STATE_COMPLETE              0x40
00971 
00972 // Logical unit extension
00973 typedef struct _HW_LU_EXTENSION {
00974     IDENTIFY_DATA2 IdentifyData;
00975     ULONGLONG      NumOfSectors;
00976     ULONG          DeviceFlags;    // Flags word for each possible device. DFLAGS_XXX
00977     ULONG          DiscsPresent;   // Indicates number of platters on changer-ish devices.
00978     BOOLEAN        DWordIO;        // Indicates use of 32-bit PIO
00979     UCHAR          ReturningMediaStatus;
00980 
00981     UCHAR          TransferMode;          // current transfer mode
00982     UCHAR          LimitedTransferMode;   // user-defined or IDE cable limitation
00983     UCHAR          OrigTransferMode;      // transfer mode, returned by device IDENTIFY (can be changed via IOCTL)
00984 
00985     UCHAR          MaximumBlockXfer;
00986     UCHAR          Padding0[2];    // padding
00987     ULONG          ErrorCount;     // Count of errors. Used to turn off features.
00988  //   ATA_QUEUE      cmd_queue;
00989     LONGLONG       ReadCmdCost;
00990     LONGLONG       WriteCmdCost;
00991     LONGLONG       OtherCmdCost;
00992     LONGLONG       RwSwitchCost;
00993     LONGLONG       RwSwitchMCost;
00994     LONGLONG       SeekBackMCost;
00995     //
00996     PATA_REQ       first_req;
00997     PATA_REQ       last_req;
00998     ULONG          queue_depth;
00999     ULONG          last_write;
01000 
01001     ULONG          LunSelectWaitCount;
01002 
01003     // tuning options
01004     ULONG          opt_GeomType;
01005     ULONG          opt_MaxTransferMode;
01006     ULONG          opt_PreferedTransferMode;
01007     BOOLEAN        opt_ReadCacheEnable;
01008     BOOLEAN        opt_WriteCacheEnable;
01009     UCHAR          opt_ReadOnly;
01010     // padding
01011     BOOLEAN        opt_reserved[1];
01012 
01013     struct _SBadBlockListItem* bbListDescr;
01014     struct _SBadBlockRange* arrBadBlocks;
01015     ULONG           nBadBlocks;
01016 
01017     // Controller-specific LUN options
01018     union {
01019         /* for tricky controllers, those can change Logical-to-Physical LUN mapping.
01020            mainly for mapping SATA ports to compatible PATA registers
01021            Treated as PHYSICAL port number, regardless of logical mapping.
01022          */
01023         ULONG          SATA_lun_map; 
01024     };
01025 
01026     struct _HW_DEVICE_EXTENSION* DeviceExtension;
01027     struct _HW_CHANNEL* chan;
01028     ULONG  Lun;
01029 
01030 #ifdef IO_STATISTICS
01031 
01032     LONGLONG ModeErrorCount[MAX_RETRIES];
01033     LONGLONG RecoverCount[MAX_RETRIES];
01034     LONGLONG IoCount;
01035     LONGLONG BlockIoCount;
01036 
01037 #endif//IO_STATISTICS
01038 } HW_LU_EXTENSION, *PHW_LU_EXTENSION;
01039 
01040 // Device extension
01041 typedef struct _HW_DEVICE_EXTENSION {
01042     CHAR Signature[32];
01043     //PIDE_REGISTERS_1 BaseIoAddress1[IDE_MAX_CHAN];    // Base register locations
01044     //PIDE_REGISTERS_2 BaseIoAddress2[IDE_MAX_CHAN];
01045     ULONG BusInterruptLevel;    // Interrupt level
01046     ULONG InterruptMode;        // Interrupt Mode (Level or Edge)
01047     ULONG BusInterruptVector;
01048     // Number of channels being supported by one instantiation
01049     // of the device extension. Normally (and correctly) one, but
01050     // with so many broken PCI IDE controllers being sold, we have
01051     // to support them.
01052     ULONG NumberChannels;
01053     ULONG NumberLuns;
01054     ULONG FirstChannelToCheck;
01055 #if 0
01056     HW_LU_EXTENSION lun[IDE_MAX_LUN];
01057     HW_CHANNEL chan[AHCI_MAX_PORT/*IDE_MAX_CHAN*/];
01058 #else
01059     PHW_LU_EXTENSION lun;
01060     PHW_CHANNEL chan;
01061 #endif
01062     UCHAR LastInterruptedChannel;
01063     // Indicates the number of blocks transferred per int. according to the
01064     // identify data.
01065     BOOLEAN DriverMustPoll;    // Driver is being used by the crash dump utility or ntldr.
01066     BOOLEAN BusMaster;
01067     BOOLEAN UseDpc;            // Indicates use of DPC on long waits
01068     IDENTIFY_DATA FullIdentifyData;    // Identify data for device
01069     // BusMaster specific data
01070 //    PBM_DMA_ENTRY dma_tab_0;
01071     //KSPIN_LOCK  DpcSpinLock;
01072 
01073     ULONG       ActiveDpcChan;
01074     ULONG       FirstDpcChan;
01075 /*
01076     PHW_TIMER   HwScsiTimer1;
01077     PHW_TIMER   HwScsiTimer2;
01078     LONGLONG    DpcTime1;
01079     LONGLONG    DpcTime2;
01080 */
01081     ULONG          queue_depth;
01082 
01083     PDEVICE_OBJECT Isr2DevObj;
01084 
01085     //PIDE_BUSMASTER_REGISTERS  BaseIoAddressBM_0;
01086     IORES                     BaseIoAddressBM_0;
01087     //PIDE_BUSMASTER_REGISTERS  BaseIoAddressBM[IDE_MAX_CHAN];
01088 
01089     // Device identification
01090     ULONG DevID;
01091     ULONG RevID;
01092     ULONG slotNumber;
01093     ULONG SystemIoBusNumber;
01094     ULONG DevIndex;
01095 
01096     ULONG InitMethod; // vendor specific
01097 
01098     ULONG Channel;
01099 
01100     ULONG HbaCtrlFlags;
01101     BOOLEAN simplexOnly;
01102     //BOOLEAN MemIo;
01103     BOOLEAN AltRegMap;
01104     BOOLEAN UnknownDev;
01105     BOOLEAN MasterDev;
01106     BOOLEAN Host64;
01107     BOOLEAN DWordIO;         // Indicates use of 32-bit PIO
01108     UCHAR   Reserved1[2];
01109 
01110     LONG  ReCheckIntr;
01111 
01112     ULONG MaxTransferMode;  // max transfer mode supported by controller
01113     ULONG HwFlags;
01114     INTERFACE_TYPE OrigAdapterInterfaceType;
01115     INTERFACE_TYPE AdapterInterfaceType;
01116     ULONG MaximumDmaTransferLength;
01117     ULONG AlignmentMask;
01118 
01119     //ULONG BaseMemAddress;
01120 
01121     //PIDE_SATA_REGISTERS       BaseIoAddressSATA_0;
01122     IORES                     BaseIoAddressSATA_0;
01123     //PIDE_SATA_REGISTERS       BaseIoAddressSATA[IDE_MAX_CHAN];
01124 
01125     IORES                     BaseIoAHCI_0;
01126     //PIDE_AHCI_PORT_REGISTERS  BaseIoAHCIPort[AHCI_MAX_PORT];
01127     ULONG                     AHCI_CAP;
01128 
01129     BOOLEAN        opt_AtapiDmaZeroTransfer; // default FALSE
01130     BOOLEAN        opt_AtapiDmaControlCmd;   // default FALSE
01131     BOOLEAN        opt_AtapiDmaRawRead;      // default TRUE
01132     BOOLEAN        opt_AtapiDmaReadWrite;    // default TRUE
01133 
01134     PCCH           FullDevName;
01135 
01136     // Controller specific state/options
01137     union {
01138         ULONG      HwCfg;
01139     };
01140 
01141 } HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION;
01142 
01143 typedef struct _ISR2_DEVICE_EXTENSION {
01144     PHW_DEVICE_EXTENSION HwDeviceExtension;
01145     ULONG DevIndex;
01146 } ISR2_DEVICE_EXTENSION, *PISR2_DEVICE_EXTENSION;
01147 
01148 #define HBAFLAGS_DMA_DISABLED           0x01
01149 #define HBAFLAGS_DMA_DISABLED_LBA48     0x02
01150 
01151 extern UCHAR         pciBuffer[256];
01152 extern PBUSMASTER_CONTROLLER_INFORMATION BMList;
01153 extern ULONG         BMListLen;
01154 extern ULONG         IsaCount;
01155 extern ULONG         MCACount;
01156 
01157 //extern const CHAR retry_Wdma[MAX_RETRIES+1];
01158 //extern const CHAR retry_Udma[MAX_RETRIES+1];
01159 
01160 extern VOID
01161 NTAPI
01162 UniataEnumBusMasterController(
01163     IN PVOID DriverObject,
01164     PVOID Argument2
01165     );
01166 
01167 extern ULONG NTAPI
01168 UniataFindCompatBusMasterController1(
01169     IN PVOID HwDeviceExtension,
01170     IN PVOID Context,
01171     IN PVOID BusInformation,
01172     IN PCHAR ArgumentString,
01173     IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
01174     OUT PBOOLEAN Again
01175     );
01176 
01177 extern ULONG NTAPI
01178 UniataFindCompatBusMasterController2(
01179     IN PVOID HwDeviceExtension,
01180     IN PVOID Context,
01181     IN PVOID BusInformation,
01182     IN PCHAR ArgumentString,
01183     IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
01184     OUT PBOOLEAN Again
01185     );
01186 
01187 #define UNIATA_ALLOCATE_NEW_LUNS  0x00
01188 
01189 extern BOOLEAN
01190 NTAPI
01191 UniataAllocateLunExt(
01192     PHW_DEVICE_EXTENSION  deviceExtension,
01193     ULONG NewNumberChannels
01194     );
01195 
01196 extern ULONG NTAPI
01197 UniataFindBusMasterController(
01198     IN PVOID HwDeviceExtension,
01199     IN PVOID Context,
01200     IN PVOID BusInformation,
01201     IN PCHAR ArgumentString,
01202     IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
01203     OUT PBOOLEAN Again
01204     );
01205 
01206 extern ULONG NTAPI
01207 UniataFindFakeBusMasterController(
01208     IN PVOID HwDeviceExtension,
01209     IN PVOID Context,
01210     IN PVOID BusInformation,
01211     IN PCHAR ArgumentString,
01212     IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
01213     OUT PBOOLEAN Again
01214     );
01215 
01216 extern NTSTATUS
01217 NTAPI
01218 UniataConnectIntr2(
01219     IN PVOID HwDeviceExtension
01220     );
01221 
01222 extern NTSTATUS
01223 NTAPI
01224 UniataDisconnectIntr2(
01225     IN PVOID HwDeviceExtension
01226     );
01227 
01228 extern ULONG
01229 NTAPI
01230 ScsiPortGetBusDataByOffset(
01231     IN PVOID  HwDeviceExtension,
01232     IN BUS_DATA_TYPE  BusDataType,
01233     IN ULONG  BusNumber,
01234     IN ULONG  SlotNumber,
01235     IN PVOID  Buffer,
01236     IN ULONG  Offset,
01237     IN ULONG  Length
01238     );
01239 
01240 #define PCIBUSNUM_NOT_SPECIFIED    (0xffffffffL)
01241 #define PCISLOTNUM_NOT_SPECIFIED   (0xffffffffL)
01242 
01243 extern ULONG
01244 NTAPI
01245 AtapiFindListedDev(
01246     PBUSMASTER_CONTROLLER_INFORMATION BusMasterAdapters,
01247     ULONG     lim,
01248     IN PVOID  HwDeviceExtension,
01249     IN ULONG  BusNumber,
01250     IN ULONG  SlotNumber,
01251     OUT PCI_SLOT_NUMBER* _slotData // optional
01252     );
01253 
01254 extern ULONG
01255 NTAPI
01256 AtapiFindDev(
01257     IN PVOID  HwDeviceExtension,
01258     IN BUS_DATA_TYPE  BusDataType,
01259     IN ULONG  BusNumber,
01260     IN ULONG  SlotNumber,
01261     IN ULONG  dev_id,
01262     IN ULONG  RevID
01263     );
01264 
01265 extern VOID
01266 NTAPI
01267 AtapiDmaAlloc(
01268     IN PVOID HwDeviceExtension,
01269     IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
01270     IN ULONG lChannel          // logical channel,
01271     );
01272 
01273 extern BOOLEAN
01274 NTAPI
01275 AtapiDmaSetup(
01276     IN PVOID HwDeviceExtension,
01277     IN ULONG DeviceNumber,
01278     IN ULONG lChannel,          // logical channel,
01279     IN PSCSI_REQUEST_BLOCK Srb,
01280     IN PUCHAR data,
01281     IN ULONG count
01282     );
01283 
01284 extern BOOLEAN
01285 NTAPI
01286 AtapiDmaPioSync(
01287     PVOID  HwDeviceExtension,
01288     PSCSI_REQUEST_BLOCK Srb,
01289     PUCHAR data,
01290     ULONG  count
01291     );
01292 
01293 extern BOOLEAN
01294 NTAPI
01295 AtapiDmaDBSync(
01296     PHW_CHANNEL chan,
01297     PSCSI_REQUEST_BLOCK Srb
01298     );
01299 
01300 extern VOID
01301 NTAPI
01302 AtapiDmaStart(
01303     IN PVOID HwDeviceExtension,
01304     IN ULONG DeviceNumber,
01305     IN ULONG lChannel,          // logical channel,
01306     IN PSCSI_REQUEST_BLOCK Srb
01307     );
01308 
01309 extern UCHAR
01310 NTAPI
01311 AtapiDmaDone(
01312     IN PVOID HwDeviceExtension,
01313     IN ULONG DeviceNumber,
01314     IN ULONG lChannel,          // logical channel,
01315     IN PSCSI_REQUEST_BLOCK Srb
01316     );
01317 
01318 extern VOID
01319 NTAPI
01320 AtapiDmaReinit(
01321     IN PHW_DEVICE_EXTENSION deviceExtension,
01322     IN PHW_LU_EXTENSION LunExt,
01323     IN PATA_REQ AtaReq
01324     );
01325 
01326 extern VOID
01327 NTAPI
01328 AtapiDmaInit__(
01329     IN PHW_DEVICE_EXTENSION deviceExtension,
01330     IN PHW_LU_EXTENSION LunExt
01331     );
01332 
01333 extern VOID
01334 NTAPI
01335 AtapiDmaInit(
01336     IN PVOID HwDeviceExtension,
01337     IN ULONG DeviceNumber,
01338     IN ULONG lChannel,          // logical channel,
01339                                // is always 0 except simplex-only and multi-channel controllers
01340     IN SCHAR apiomode,
01341     IN SCHAR wdmamode,
01342     IN SCHAR udmamode
01343     );
01344 
01345 extern BOOLEAN NTAPI
01346 AtapiInterrupt2(
01347     IN PKINTERRUPT Interrupt,
01348     IN PVOID HwDeviceExtension
01349     );
01350 
01351 extern PDRIVER_OBJECT SavedDriverObject;
01352 
01353 extern BOOLEAN
01354 NTAPI
01355 UniataChipDetectChannels(
01356     IN PVOID HwDeviceExtension,
01357     IN PPCI_COMMON_CONFIG pciData, // optional
01358     IN ULONG DeviceNumber,
01359     IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
01360     );
01361 
01362 extern NTSTATUS
01363 NTAPI
01364 UniataChipDetect(
01365     IN PVOID HwDeviceExtension,
01366     IN PPCI_COMMON_CONFIG pciData, // optional
01367     IN ULONG DeviceNumber,
01368     IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
01369     IN BOOLEAN* simplexOnly
01370     );
01371 
01372 extern BOOLEAN
01373 NTAPI
01374 AtapiChipInit(
01375     IN PVOID HwDeviceExtension,
01376     IN ULONG DeviceNumber,
01377     IN ULONG c
01378     );
01379 
01380 extern ULONG
01381 NTAPI
01382 AtapiGetIoRange(
01383     IN PVOID HwDeviceExtension,
01384     IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
01385     IN PPCI_COMMON_CONFIG pciData,
01386     IN ULONG SystemIoBusNumber,
01387     IN ULONG rid,
01388     IN ULONG offset,
01389     IN ULONG length //range id
01390     );
01391 
01392 /****************** 1 *****************/
01393 #define GetPciConfig1(offs, op) {                                \
01394     ScsiPortGetBusDataByOffset(HwDeviceExtension,                \
01395                                PCIConfiguration,                 \
01396                                SystemIoBusNumber,                \
01397                                slotNumber,                       \
01398                                &op,                              \
01399                                offs,                             \
01400                                1);                               \
01401 }
01402 
01403 #define SetPciConfig1(offs, op) {                                \
01404     UCHAR _a = op;                                              \
01405     ScsiPortSetBusDataByOffset(HwDeviceExtension,                \
01406                                PCIConfiguration,                 \
01407                                SystemIoBusNumber,                \
01408                                slotNumber,                       \
01409                                &_a,                              \
01410                                offs,                             \
01411                                1);                               \
01412 }
01413 
01414 #define ChangePciConfig1(offs, _op) {                            \
01415     UCHAR a = 0;                                                 \
01416     GetPciConfig1(offs, a);                                      \
01417     a = (UCHAR)(_op);                                            \
01418     SetPciConfig1(offs, a);                                      \
01419 }
01420 
01421 /****************** 2 *****************/
01422 #define GetPciConfig2(offs, op) {                                \
01423     ScsiPortGetBusDataByOffset(HwDeviceExtension,                \
01424                                PCIConfiguration,                 \
01425                                SystemIoBusNumber,                \
01426                                slotNumber,                       \
01427                                &op,                              \
01428                                offs,                             \
01429                                2);                               \
01430 }
01431 
01432 #define SetPciConfig2(offs, op) {                                \
01433     USHORT _a = op;                                              \
01434     ScsiPortSetBusDataByOffset(HwDeviceExtension,                \
01435                                PCIConfiguration,                 \
01436                                SystemIoBusNumber,                \
01437                                slotNumber,                       \
01438                                &_a,                              \
01439                                offs,                             \
01440                                2);                               \
01441 }
01442 
01443 #define ChangePciConfig2(offs, _op) {                            \
01444     USHORT a = 0;                                                \
01445     GetPciConfig2(offs, a);                                      \
01446     a = (USHORT)(_op);                                           \
01447     SetPciConfig2(offs, a);                                      \
01448 }
01449 
01450 /****************** 4 *****************/
01451 #define GetPciConfig4(offs, op) {                                \
01452     ScsiPortGetBusDataByOffset(HwDeviceExtension,                \
01453                                PCIConfiguration,                 \
01454                                SystemIoBusNumber,                \
01455                                slotNumber,                       \
01456                                &op,                              \
01457                                offs,                             \
01458                                4);                               \
01459 }
01460 
01461 #define SetPciConfig4(offs, op) {                                \
01462     ULONG _a = op;                                               \
01463     ScsiPortSetBusDataByOffset(HwDeviceExtension,                \
01464                                PCIConfiguration,                 \
01465                                SystemIoBusNumber,                \
01466                                slotNumber,                       \
01467                                &_a,                              \
01468                                offs,                             \
01469                                4);                               \
01470 }
01471 
01472 #define ChangePciConfig4(offs, _op) {                            \
01473     ULONG a = 0;                                                 \
01474     GetPciConfig4(offs, a);                                      \
01475     a = _op;                                                     \
01476     SetPciConfig4(offs, a);                                      \
01477 }
01478 
01479 #ifndef GetDmaStatus
01480 #define GetDmaStatus(de, c) \
01481     (((de)->BusMaster) ? AtapiReadPort1(&((de)->chan[c]), IDX_BM_Status) : 0)
01482 #endif //GetDmaStatus
01483 
01484 #ifdef USE_OWN_DMA
01485 #define AtapiVirtToPhysAddr(hwde, srb, phaddr, plen, phaddru) \
01486     AtapiVirtToPhysAddr_(hwde, srb, phaddr, plen, phaddru);
01487 #else
01488 #define AtapiVirtToPhysAddr(hwde, srb, phaddr, plen, phaddru) \
01489     (ScsiPortConvertPhysicalAddressToUlong/*(ULONG)ScsiPortGetVirtualAddress*/(/*hwde,*/  \
01490                     ScsiPortGetPhysicalAddress(hwde, srb, phaddr, plen)))
01491 #endif //USE_OWN_DMA
01492 
01493 VOID
01494 DDKFASTAPI
01495 AtapiWritePort4(
01496     IN PHW_CHANNEL chan,
01497     IN ULONGIO_PTR port,
01498     IN ULONG data
01499     );
01500 
01501 VOID
01502 DDKFASTAPI
01503 AtapiWritePort2(
01504     IN PHW_CHANNEL chan,
01505     IN ULONGIO_PTR port,
01506     IN USHORT data
01507     );
01508 
01509 VOID
01510 DDKFASTAPI
01511 AtapiWritePort1(
01512     IN PHW_CHANNEL chan,
01513     IN ULONGIO_PTR port,
01514     IN UCHAR data
01515     );
01516 
01517 VOID
01518 DDKFASTAPI
01519 AtapiWritePortEx4(
01520     IN PHW_CHANNEL chan,
01521     IN ULONGIO_PTR port,
01522     IN ULONG offs,
01523     IN ULONG data
01524     );
01525 
01526 VOID
01527 DDKFASTAPI
01528 AtapiWritePortEx1(
01529     IN PHW_CHANNEL chan,
01530     IN ULONGIO_PTR port,
01531     IN ULONG offs,
01532     IN UCHAR data
01533     );
01534 
01535 ULONG
01536 DDKFASTAPI
01537 AtapiReadPort4(
01538     IN PHW_CHANNEL chan,
01539     IN ULONGIO_PTR port
01540     );
01541 
01542 USHORT
01543 DDKFASTAPI
01544 AtapiReadPort2(
01545     IN PHW_CHANNEL chan,
01546     IN ULONGIO_PTR port
01547     );
01548 
01549 UCHAR
01550 DDKFASTAPI
01551 AtapiReadPort1(
01552     IN PHW_CHANNEL chan,
01553     IN ULONGIO_PTR port
01554     );
01555 
01556 ULONG
01557 DDKFASTAPI
01558 AtapiReadPortEx4(
01559     IN PHW_CHANNEL chan,
01560     IN ULONGIO_PTR port,
01561     IN ULONG offs
01562     );
01563 
01564 UCHAR
01565 DDKFASTAPI
01566 AtapiReadPortEx1(
01567     IN PHW_CHANNEL chan,
01568     IN ULONGIO_PTR port,
01569     IN ULONG offs
01570     );
01571 
01572 VOID
01573 DDKFASTAPI
01574 AtapiWriteBuffer4(
01575     IN PHW_CHANNEL chan,
01576     IN ULONGIO_PTR _port,
01577     IN PVOID Buffer,
01578     IN ULONG Count,
01579     IN ULONG Timing
01580     );
01581 
01582 VOID
01583 DDKFASTAPI
01584 AtapiWriteBuffer2(
01585     IN PHW_CHANNEL chan,
01586     IN ULONGIO_PTR _port,
01587     IN PVOID Buffer,
01588     IN ULONG Count,
01589     IN ULONG Timing
01590     );
01591 
01592 VOID
01593 DDKFASTAPI
01594 AtapiReadBuffer4(
01595     IN PHW_CHANNEL chan,
01596     IN ULONGIO_PTR _port,
01597     IN PVOID Buffer,
01598     IN ULONG Count,
01599     IN ULONG Timing
01600     );
01601 
01602 VOID
01603 DDKFASTAPI
01604 AtapiReadBuffer2(
01605     IN PHW_CHANNEL chan,
01606     IN ULONGIO_PTR _port,
01607     IN PVOID Buffer,
01608     IN ULONG Count,
01609     IN ULONG Timing
01610     );
01611 
01612 /*#define GET_CHANNEL(Srb)  (Srb->TargetId >> 1)
01613 #define GET_LDEV(Srb)  (Srb->TargetId)
01614 #define GET_LDEV2(P, T, L)  (T)*/
01615 
01616 #define GET_CHANNEL(Srb)  (Srb->PathId)
01617 //#define GET_LDEV(Srb)  (Srb->TargetId | (Srb->PathId << 1))
01618 //#define GET_LDEV2(P, T, L)  (T | ((P)<<1))
01619 #define GET_CDEV(Srb)  (Srb->TargetId)
01620 
01621 VOID
01622 NTAPI
01623 AtapiSetupLunPtrs(
01624     IN PHW_CHANNEL chan,
01625     IN PHW_DEVICE_EXTENSION deviceExtension,
01626     IN ULONG c
01627     );
01628 /*
01629 #define AtapiSetupLunPtrs(chan, deviceExtension, c) \
01630 { \
01631         chan->DeviceExtension = deviceExtension; \
01632         chan->lChannel        = c; \
01633         chan->lun[0] = &(deviceExtension->lun[c*2+0]); \
01634         chan->lun[1] = &(deviceExtension->lun[c*2+1]); \
01635         chan->AltRegMap       = deviceExtension->AltRegMap; \
01636         chan->NextDpcChan     = -1; \
01637         chan->lun[0]->DeviceExtension = deviceExtension; \
01638         chan->lun[1]->DeviceExtension = deviceExtension; \
01639 }
01640 */
01641 BOOLEAN
01642 NTAPI
01643 AtapiReadChipConfig(
01644     IN PVOID HwDeviceExtension,
01645     IN ULONG DeviceNumber,
01646     IN ULONG channel // physical channel
01647     );
01648 
01649 VOID
01650 NTAPI
01651 UniataForgetDevice(
01652     PHW_LU_EXTENSION   LunExt
01653     );
01654 
01655 extern ULONG SkipRaids;
01656 extern ULONG ForceSimplex;
01657 extern BOOLEAN g_opt_AtapiDmaRawRead;
01658 
01659 extern BOOLEAN InDriverEntry;
01660 
01661 extern BOOLEAN g_opt_Verbose;
01662 extern ULONG   g_opt_VirtualMachine;
01663 
01664 #define VM_AUTO      0x00
01665 #define VM_NONE      0x01
01666 #define VM_VBOX      0x02
01667 #define VM_VMWARE    0x03
01668 #define VM_QEMU      0x04
01669 
01670 #define VM_MAX_KNOWN VM_QEMU
01671 
01672 extern BOOLEAN WinVer_WDM_Model;
01673 
01674 #endif //__IDE_BUSMASTER_H__

Generated on Sat May 26 2012 04:26:55 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.