ReactOS 0.4.16-dev-1946-g52006dd
bsmaster.h File Reference
#include "config.h"
#include "tools.h"
#include "bm_devs_decl.h"
#include "uata_ctl.h"
Include dependency graph for bsmaster.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _BUSMASTER_CTX
 
struct  BM_DMA_ENTRY
 
struct  _IDE_BUSMASTER_REGISTERS
 
struct  _IDE_AHCI_REGISTERS
 
union  _SATA_SSTATUS_REG
 
union  _SATA_SCONTROL_REG
 
union  _SATA_SERROR_REG
 
struct  _IDE_SATA_REGISTERS
 
union  _AHCI_IS_REG
 
struct  _IDE_AHCI_PORT_REGISTERS
 
struct  _IDE_AHCI_PRD_ENTRY
 
struct  _AHCI_ATA_H2D_FIS
 
struct  _IDE_AHCI_CMD
 
struct  _IDE_AHCI_CMD_LIST
 
struct  _IDE_AHCI_RCV_FIS
 
struct  _IDE_AHCI_CHANNEL_CTL_BLOCK
 
union  _ATA_REQ
 
struct  _IORES
 
struct  _HW_CHANNEL
 
struct  _HW_LU_EXTENSION
 
struct  _HW_DEVICE_EXTENSION
 
struct  _ISR2_DEVICE_EXTENSION
 

Macros

#define ATA_IDLE   0x0
 
#define ATA_IMMEDIATE   0x1
 
#define ATA_WAIT_INTR   0x2
 
#define ATA_WAIT_READY   0x3
 
#define ATA_ACTIVE   0x4
 
#define ATA_ACTIVE_ATA   0x5
 
#define ATA_ACTIVE_ATAPI   0x6
 
#define ATA_REINITING   0x7
 
#define ATA_WAIT_BASE_READY   0x8
 
#define ATA_WAIT_IDLE   0x9
 
#define MAX_RETRIES   6
 
#define RETRY_UDMA2   1
 
#define RETRY_WDMA   2
 
#define RETRY_PIO   3
 
#define IO_WD1   0x1F0 /* Primary Fixed Disk Controller */
 
#define IO_WD2   0x170 /* Secondary Fixed Disk Controller */
 
#define IP_PC98_BANK   0x432
 
#define IO_FLOPPY_INT   0x3F6 /* AltStatus inside Floppy I/O range */
 
#define PCI_ADDRESS_IOMASK   0xfffffff0
 
#define ATA_BM_OFFSET1   0x08
 
#define ATA_IOSIZE   0x08
 
#define ATA_ALTOFFSET   0x206 /* alternate registers offset */
 
#define ATA_PCCARD_ALTOFFSET   0x0e /* do for PCCARD devices */
 
#define ATA_ALTIOSIZE   0x01 /* alternate registers size */
 
#define ATA_BMIOSIZE   0x20
 
#define ATA_PC98_BANKIOSIZE   0x01
 
#define ATA_MAX_IOLBA28   DEF_U64(0x0fffff80)
 
#define ATA_MAX_LBA28   DEF_U64(0x0fffffff)
 
#define ATA_MAX_IOLBA32   DEF_U64(0xffffff80)
 
#define ATA_MAX_LBA32   DEF_U64(0xffffffff)
 
#define ATA_DMA_ENTRIES   256 /* PAGESIZE/2/sizeof(BM_DMA_ENTRY)*/
 
#define ATA_DMA_EOT   0x80000000
 
#define DEV_BSIZE   512
 
#define ATAPI_MAGIC_LSB   0x14
 
#define ATAPI_MAGIC_MSB   0xeb
 
#define AHCI_MAX_PORT   32
 
#define SATA_MAX_PM_UNITS   16
 
#define PCI_DEV_CLASS_STORAGE   0x01
 
#define PCI_DEV_SUBCLASS_IDE   0x01
 
#define PCI_DEV_SUBCLASS_RAID   0x04
 
#define PCI_DEV_SUBCLASS_ATA   0x05
 
#define PCI_DEV_SUBCLASS_SATA   0x06
 
#define PCI_DEV_PROGIF_AHCI_1_0   0x01
 
#define BM_STATUS_ACTIVE   0x01
 
#define BM_STATUS_ERR   0x02
 
#define BM_STATUS_INTR   0x04
 
#define BM_STATUS_MASK   0x07
 
#define BM_STATUS_DRIVE_0_DMA   0x20
 
#define BM_STATUS_DRIVE_1_DMA   0x40
 
#define BM_STATUS_SIMPLEX_ONLY   0x80
 
#define BM_COMMAND_START_STOP   0x01
 
#define BM_COMMAND_WRITE   0x00
 
#define BM_COMMAND_READ   0x08
 
#define BM_DS0_SII_DMA_ENABLE   (1 << 0) /* DMA run switch */
 
#define BM_DS0_SII_IRQ   (1 << 3) /* ??? */
 
#define BM_DS0_SII_DMA_SATA_IRQ   (1 << 4) /* OR of all SATA IRQs */
 
#define BM_DS0_SII_DMA_ERROR   (1 << 17) /* PCI bus error */
 
#define BM_DS0_SII_DMA_COMPLETE   (1 << 18) /* cmd complete / IRQ pending */
 
#define IDX_BM_IO   (IDX_IO2_o+IDX_IO2_o_SZ)
 
#define IDX_BM_IO_SZ   5
 
#define IDX_BM_Command   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, Command )+IDX_BM_IO)
 
#define IDX_BM_DeviceSpecific0   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific0)+IDX_BM_IO)
 
#define IDX_BM_Status   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, Status )+IDX_BM_IO)
 
#define IDX_BM_DeviceSpecific1   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific1)+IDX_BM_IO)
 
#define IDX_BM_PRD_Table   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, PRD_Table )+IDX_BM_IO)
 
#define AHCI_CAP_NOP_MASK   0x0000001f
 
#define AHCI_CAP_CCC   0x00000080
 
#define AHCI_CAP_NCS_MASK   0x00001f00
 
#define AHCI_CAP_PMD   0x00008000
 
#define AHCI_CAP_SPM   0x00020000
 
#define AHCI_CAP_SAM   0x00040000
 
#define AHCI_CAP_ISS_MASK   0x00f00000
 
#define AHCI_CAP_SCLO   0x01000000
 
#define AHCI_CAP_SNTF   0x20000000
 
#define AHCI_CAP_NCQ   0x40000000
 
#define AHCI_CAP_S64A   0x80000000
 
#define AHCI_GHC   0x04
 
#define AHCI_GHC_HR   0x00000001
 
#define AHCI_GHC_IE   0x00000002
 
#define AHCI_GHC_AE   0x80000000
 
#define AHCI_CAP2_BOH   0x00000001
 
#define AHCI_CAP2_NVMP   0x00000002
 
#define AHCI_CAP2_APST   0x00000004
 
#define AHCI_BOHC_BB   0x00000001
 
#define AHCI_BOHC_OOC   0x00000002
 
#define AHCI_BOHC_SOOE   0x00000004
 
#define AHCI_BOHC_OOS   0x00000008
 
#define AHCI_BOHC_BOS   0x00000010
 
#define IDX_AHCI_CAP   (FIELD_OFFSET(IDE_AHCI_REGISTERS, CAP))
 
#define IDX_AHCI_GHC   (FIELD_OFFSET(IDE_AHCI_REGISTERS, GHC))
 
#define IDX_AHCI_IS   (FIELD_OFFSET(IDE_AHCI_REGISTERS, IS))
 
#define IDX_AHCI_VS   (FIELD_OFFSET(IDE_AHCI_REGISTERS, VS))
 
#define IDX_AHCI_PI   (FIELD_OFFSET(IDE_AHCI_REGISTERS, PI))
 
#define IDX_AHCI_CAP2   (FIELD_OFFSET(IDE_AHCI_REGISTERS, CAP2))
 
#define IDX_AHCI_BOHC   (FIELD_OFFSET(IDE_AHCI_REGISTERS, BOHC))
 
#define SStatus_DET_NoDev   0x00
 
#define SStatus_DET_Dev_NoPhy   0x01
 
#define SStatus_DET_Dev_Ok   0x03
 
#define SStatus_DET_Offline   0x04
 
#define SStatus_SPD_NoDev   0x00
 
#define SStatus_SPD_Gen1   0x01
 
#define SStatus_SPD_Gen2   0x02
 
#define SStatus_SPD_Gen3   0x03
 
#define SStatus_IPM_NoDev   0x00
 
#define SStatus_IPM_Active   0x01
 
#define SStatus_IPM_Partial   0x02
 
#define SStatus_IPM_Slumber   0x06
 
#define ATA_SS_DET_MASK   0x0000000f
 
#define ATA_SS_DET_NO_DEVICE   0x00000000
 
#define ATA_SS_DET_DEV_PRESENT   0x00000001
 
#define ATA_SS_DET_PHY_ONLINE   0x00000003
 
#define ATA_SS_DET_PHY_OFFLINE   0x00000004
 
#define ATA_SS_SPD_MASK   0x000000f0
 
#define ATA_SS_SPD_NO_SPEED   0x00000000
 
#define ATA_SS_SPD_GEN1   0x00000010
 
#define ATA_SS_SPD_GEN2   0x00000020
 
#define ATA_SS_IPM_MASK   0x00000f00
 
#define ATA_SS_IPM_NO_DEVICE   0x00000000
 
#define ATA_SS_IPM_ACTIVE   0x00000100
 
#define ATA_SS_IPM_PARTIAL   0x00000200
 
#define ATA_SS_IPM_SLUMBER   0x00000600
 
#define SControl_DET_DoNothing   0x00
 
#define SControl_DET_Idle   0x00
 
#define SControl_DET_Init   0x01
 
#define SControl_DET_Disable   0x04
 
#define SControl_SPD_NoRestrict   0x00
 
#define SControl_SPD_LimGen1   0x01
 
#define SControl_SPD_LimGen2   0x02
 
#define SControl_SPD_LimGen3   0x03
 
#define SControl_IPM_NoRestrict   0x00
 
#define SControl_IPM_NoPartial   0x01
 
#define SControl_IPM_NoSlumber   0x02
 
#define SControl_IPM_NoPartialSlumber   0x03
 
#define ATA_SC_DET_MASK   0x0000000f
 
#define ATA_SC_DET_IDLE   0x00000000
 
#define ATA_SC_DET_RESET   0x00000001
 
#define ATA_SC_DET_DISABLE   0x00000004
 
#define ATA_SC_SPD_MASK   0x000000f0
 
#define ATA_SC_SPD_NO_SPEED   0x00000000
 
#define ATA_SC_SPD_SPEED_GEN1   0x00000010
 
#define ATA_SC_SPD_SPEED_GEN2   0x00000020
 
#define ATA_SC_SPD_SPEED_GEN3   0x00000040
 
#define ATA_SC_IPM_MASK   0x00000f00
 
#define ATA_SC_IPM_NONE   0x00000000
 
#define ATA_SC_IPM_DIS_PARTIAL   0x00000100
 
#define ATA_SC_IPM_DIS_SLUMBER   0x00000200
 
#define ATA_SE_DATA_CORRECTED   0x00000001
 
#define ATA_SE_COMM_CORRECTED   0x00000002
 
#define ATA_SE_DATA_ERR   0x00000100
 
#define ATA_SE_COMM_ERR   0x00000200
 
#define ATA_SE_PROT_ERR   0x00000400
 
#define ATA_SE_HOST_ERR   0x00000800
 
#define ATA_SE_PHY_CHANGED   0x00010000
 
#define ATA_SE_PHY_IERROR   0x00020000
 
#define ATA_SE_COMM_WAKE   0x00040000
 
#define ATA_SE_DECODE_ERR   0x00080000
 
#define ATA_SE_PARITY_ERR   0x00100000
 
#define ATA_SE_CRC_ERR   0x00200000
 
#define ATA_SE_HANDSHAKE_ERR   0x00400000
 
#define ATA_SE_LINKSEQ_ERR   0x00800000
 
#define ATA_SE_TRANSPORT_ERR   0x01000000
 
#define ATA_SE_UNKNOWN_FIS   0x02000000
 
#define IDX_SATA_IO   (IDX_BM_IO+IDX_BM_IO_SZ)
 
#define IDX_SATA_IO_SZ   5
 
#define IDX_SATA_SStatus   (0+IDX_SATA_IO)
 
#define IDX_SATA_SError   (1+IDX_SATA_IO)
 
#define IDX_SATA_SControl   (2+IDX_SATA_IO)
 
#define IDX_SATA_SActive   (3+IDX_SATA_IO)
 
#define IDX_SATA_SNTF_PMN   (4+IDX_SATA_IO)
 
#define IDX_INDEXED_IO   (IDX_SATA_IO+IDX_SATA_IO_SZ)
 
#define IDX_INDEXED_IO_SZ   2
 
#define IDX_INDEXED_ADDR   (0+IDX_INDEXED_IO)
 
#define IDX_INDEXED_DATA   (1+IDX_INDEXED_IO)
 
#define IDX_MAX_REG   (IDX_INDEXED_IO+IDX_INDEXED_IO_SZ)
 
#define ATA_AHCI_P_IX_DHR   0x00000001
 
#define ATA_AHCI_P_IX_PS   0x00000002
 
#define ATA_AHCI_P_IX_DS   0x00000004
 
#define ATA_AHCI_P_IX_SDB   0x00000008
 
#define ATA_AHCI_P_IX_UF   0x00000010
 
#define ATA_AHCI_P_IX_DP   0x00000020
 
#define ATA_AHCI_P_IX_PC   0x00000040
 
#define ATA_AHCI_P_IX_DI   0x00000080
 
#define ATA_AHCI_P_IX_PRC   0x00400000
 
#define ATA_AHCI_P_IX_IPM   0x00800000
 
#define ATA_AHCI_P_IX_OF   0x01000000
 
#define ATA_AHCI_P_IX_INF   0x04000000
 
#define ATA_AHCI_P_IX_IF   0x08000000
 
#define ATA_AHCI_P_IX_HBD   0x10000000
 
#define ATA_AHCI_P_IX_HBF   0x20000000
 
#define ATA_AHCI_P_IX_TFE   0x40000000
 
#define ATA_AHCI_P_IX_CPD   0x80000000
 
#define AHCI_CLB_ALIGNEMENT_MASK   ((ULONGLONG)(1024-1))
 
#define AHCI_FIS_ALIGNEMENT_MASK   ((ULONGLONG)(256-1))
 
#define AHCI_CMD_ALIGNEMENT_MASK   ((ULONGLONG)(128-1))
 
#define SATA_CMD_ICC_Idle   0x00
 
#define SATA_CMD_ICC_NoOp   0x00
 
#define SATA_CMD_ICC_Active   0x01
 
#define SATA_CMD_ICC_Partial   0x02
 
#define SATA_CMD_ICC_Slumber   0x06
 
#define IDX_AHCI_P_CLB   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CLB))
 
#define IDX_AHCI_P_FB   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, FB))
 
#define IDX_AHCI_P_IS   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IS))
 
#define IDX_AHCI_P_IE   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IE))
 
#define IDX_AHCI_P_CI   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CI))
 
#define IDX_AHCI_P_TFD   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD))
 
#define IDX_AHCI_P_SIG   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG))
 
#define IDX_AHCI_P_CMD   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CMD))
 
#define IDX_AHCI_P_SStatus   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SStatus))
 
#define IDX_AHCI_P_SControl   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SControl))
 
#define IDX_AHCI_P_SError   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SError))
 
#define IDX_AHCI_P_ACT   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SACT))
 
#define IDX_AHCI_P_SNTF   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SNTF))
 
#define ATA_AHCI_P_CMD_ST   0x00000001
 
#define ATA_AHCI_P_CMD_SUD   0x00000002
 
#define ATA_AHCI_P_CMD_POD   0x00000004
 
#define ATA_AHCI_P_CMD_CLO   0x00000008
 
#define ATA_AHCI_P_CMD_FRE   0x00000010
 
#define ATA_AHCI_P_CMD_CCS_MASK   0x00001f00
 
#define ATA_AHCI_P_CMD_ISS   0x00002000
 
#define ATA_AHCI_P_CMD_FR   0x00004000
 
#define ATA_AHCI_P_CMD_CR   0x00008000
 
#define ATA_AHCI_P_CMD_CPS   0x00010000
 
#define ATA_AHCI_P_CMD_PMA   0x00020000
 
#define ATA_AHCI_P_CMD_HPCP   0x00040000
 
#define ATA_AHCI_P_CMD_ISP   0x00080000
 
#define ATA_AHCI_P_CMD_CPD   0x00100000
 
#define ATA_AHCI_P_CMD_ESP   0x00200000
 
#define ATA_AHCI_P_CMD_ATAPI   0x01000000
 
#define ATA_AHCI_P_CMD_DLAE   0x02000000
 
#define ATA_AHCI_P_CMD_ALPE   0x04000000
 
#define ATA_AHCI_P_CMD_ASP   0x08000000
 
#define ATA_AHCI_P_CMD_ICC_MASK   0xf0000000
 
#define ATA_AHCI_P_CMD_NOOP   0x00000000
 
#define ATA_AHCI_P_CMD_ACTIVE   0x10000000
 
#define ATA_AHCI_P_CMD_PARTIAL   0x20000000
 
#define ATA_AHCI_P_CMD_SLUMBER   0x60000000
 
#define ATA_AHCI_DMA_ENTRIES   (PAGE_SIZE/2/sizeof(IDE_AHCI_PRD_ENTRY)) /* 128 */
 
#define ATA_AHCI_MAX_TAGS   32
 
#define AHCI_FIS_TYPE_ATA_H2D   0x27
 
#define AHCI_FIS_TYPE_ATA_D2H   0x34
 
#define AHCI_FIS_TYPE_DMA_D2H   0x39
 
#define AHCI_FIS_TYPE_DMA_BiDi   0x41
 
#define AHCI_FIS_TYPE_DATA_BiDi   0x46
 
#define AHCI_FIS_TYPE_BIST_BiDi   0x58
 
#define AHCI_FIS_TYPE_PIO_D2H   0x5f
 
#define AHCI_FIS_TYPE_DEV_BITS_D2H   0xA1
 
#define IDX_AHCI_o_Command   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, Command))
 
#define IDX_AHCI_o_Feature   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, Feature))
 
#define IDX_AHCI_o_BlockNumber   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockNumber ))
 
#define IDX_AHCI_o_CylinderLow   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderLow ))
 
#define IDX_AHCI_o_CylinderHigh   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderHigh))
 
#define IDX_AHCI_o_DriveSelect   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, DriveSelect ))
 
#define IDX_AHCI_o_BlockCount   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockCount))
 
#define IDX_AHCI_o_Control   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, Control))
 
#define IDX_AHCI_o_FeatureExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, FeatureExp))
 
#define IDX_AHCI_o_BlockNumberExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockNumberExp ))
 
#define IDX_AHCI_o_CylinderLowExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderLowExp ))
 
#define IDX_AHCI_o_CylinderHighExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderHighExp))
 
#define IDX_AHCI_o_BlockCountExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockCountExp))
 
#define AHCI_FIS_COMM_PM   (0x80 | AHCI_DEV_SEL_PM)
 
#define AHCI_DEV_SEL_1   0x00
 
#define AHCI_DEV_SEL_2   0x01
 
#define AHCI_DEV_SEL_PM   0x0f
 
#define ATA_AHCI_CMD_ATAPI   0x0020
 
#define ATA_AHCI_CMD_WRITE   0x0040
 
#define ATA_AHCI_CMD_PREFETCH   0x0080
 
#define ATA_AHCI_CMD_RESET   0x0100
 
#define ATA_AHCI_CMD_BIST   0x0200
 
#define ATA_AHCI_CMD_CLR_BUSY   0x0400
 
#define IsBusMaster(pciData)
 
#define PCI_IDE_PROGIF_NATIVE_1   0x01
 
#define PCI_IDE_PROGIF_NATIVE_2   0x04
 
#define PCI_IDE_PROGIF_NATIVE_ALL   0x05
 
#define IsMasterDev(pciData)
 
#define MIN_REQ_TTL   4
 
#define REQ_FLAG_FORCE_DOWNRATE   0x01
 
#define REQ_FLAG_DMA_OPERATION   0x02
 
#define REQ_FLAG_REORDERABLE_CMD   0x04
 
#define REQ_FLAG_RW_MASK   0x08
 
#define REQ_FLAG_READ   0x08
 
#define REQ_FLAG_WRITE   0x00
 
#define REQ_FLAG_FORCE_DOWNRATE_LBA48   0x10
 
#define REQ_FLAG_DMA_DBUF   0x20
 
#define REQ_FLAG_DMA_DBUF_PRD   0x40
 
#define REQ_FLAG_LBA48   0x80
 
#define REQ_STATE_NONE   0x00
 
#define REQ_STATE_QUEUED   0x10
 
#define REQ_STATE_PREPARE_TO_TRANSFER   0x20
 
#define REQ_STATE_PREPARE_TO_NEXT   0x21
 
#define REQ_STATE_READY_TO_TRANSFER   0x30
 
#define REQ_STATE_EXPECTING_INTR   0x40
 
#define REQ_STATE_ATAPI_EXPECTING_CMD_INTR   0x41
 
#define REQ_STATE_ATAPI_EXPECTING_DATA_INTR   0x42
 
#define REQ_STATE_ATAPI_EXPECTING_DATA_INTR2   0x43
 
#define REQ_STATE_ATAPI_DO_NOTHING_INTR   0x44
 
#define REQ_STATE_EARLY_INTR   0x48
 
#define REQ_STATE_PROCESSING_INTR   0x50
 
#define REQ_STATE_DPC_INTR_REQ   0x51
 
#define REQ_STATE_DPC_RESET_REQ   0x52
 
#define REQ_STATE_DPC_COMPLETE_REQ   0x53
 
#define REQ_STATE_DPC_WAIT_BUSY0   0x57
 
#define REQ_STATE_DPC_WAIT_BUSY1   0x58
 
#define REQ_STATE_DPC_WAIT_BUSY   0x59
 
#define REQ_STATE_DPC_WAIT_DRQ   0x5a
 
#define REQ_STATE_DPC_WAIT_DRQ0   0x5b
 
#define REQ_STATE_DPC_WAIT_DRQ_ERR   0x5c
 
#define REQ_STATE_TRANSFER_COMPLETE   0x7f
 
#define CMD_ACTION_PREPARE   0x01
 
#define CMD_ACTION_EXEC   0x02
 
#define CMD_ACTION_ALL   (CMD_ACTION_PREPARE | CMD_ACTION_EXEC)
 
#define REORDER_COST_MAX   ((DEF_I64(0x1) << 60) - 1)
 
#define REORDER_COST_TTL   (REORDER_COST_MAX - 1)
 
#define REORDER_COST_INTERSECT   (REORDER_COST_MAX - 2)
 
#define REORDER_COST_DENIED   (REORDER_COST_MAX - 3)
 
#define REORDER_COST_RESELECT   (REORDER_COST_MAX/4)
 
#define REORDER_COST_SWITCH_RW_CD   (REORDER_COST_MAX/8)
 
#define REORDER_MCOST_SWITCH_RW_CD   (0)
 
#define REORDER_MCOST_SEEK_BACK_CD   (16)
 
#define REORDER_COST_SWITCH_RW_HDD   (0)
 
#define REORDER_MCOST_SWITCH_RW_HDD   (4)
 
#define REORDER_MCOST_SEEK_BACK_HDD   (2)
 
#define CHECK_INTR_ACTIVE   0x03
 
#define CHECK_INTR_DETECTED   0x02
 
#define CHECK_INTR_CHECK   0x01
 
#define CHECK_INTR_IDLE   0x00
 
#define CTRFLAGS_DMA_ACTIVE   0x0001
 
#define CTRFLAGS_DMA_RO   0x0002
 
#define CTRFLAGS_DMA_OPERATION   0x0004
 
#define CTRFLAGS_INTR_DISABLED   0x0008
 
#define CTRFLAGS_DPC_REQ   0x0010
 
#define CTRFLAGS_ENABLE_INTR_REQ   0x0020
 
#define CTRFLAGS_LBA48   0x0040
 
#define CTRFLAGS_DSC_BSY   0x0080
 
#define CTRFLAGS_NO_SLAVE   0x0100
 
#define CTRFLAGS_AHCI_PM   0x0400
 
#define CTRFLAGS_AHCI_PM2   0x0800
 
#define CTRFLAGS_PERMANENT   (CTRFLAGS_DMA_RO | CTRFLAGS_NO_SLAVE)
 
#define GEOM_AUTO   0xffffffff
 
#define GEOM_STD   0x0000
 
#define GEOM_UNIATA   0x0001
 
#define GEOM_ORIG   0x0002
 
#define GEOM_MANUAL   0x0003
 
#define DPC_STATE_NONE   0x00
 
#define DPC_STATE_ISR   0x10
 
#define DPC_STATE_DPC   0x20
 
#define DPC_STATE_TIMER   0x30
 
#define DPC_STATE_COMPLETE   0x40
 
#define HBAFLAGS_DMA_DISABLED   0x01
 
#define HBAFLAGS_DMA_DISABLED_LBA48   0x02
 
#define UNIATA_ALLOCATE_NEW_LUNS   0x00
 
#define PCIBUSNUM_NOT_SPECIFIED   (0xffffffffL)
 
#define PCISLOTNUM_NOT_SPECIFIED   (0xffffffffL)
 
#define GetPciConfig1(offs, op)
 
#define SetPciConfig1(offs, op)
 
#define ChangePciConfig1(offs, _op)
 
#define GetPciConfig2(offs, op)
 
#define SetPciConfig2(offs, op)
 
#define ChangePciConfig2(offs, _op)
 
#define GetPciConfig4(offs, op)
 
#define SetPciConfig4(offs, op)
 
#define ChangePciConfig4(offs, _op)
 
#define DMA_MODE_NONE   0x00
 
#define DMA_MODE_BM   0x01
 
#define DMA_MODE_AHCI   0x02
 
#define GetDmaStatus(de, c)    (((de)->BusMaster == DMA_MODE_BM) ? AtapiReadPort1(&((de)->chan[c]), IDX_BM_Status) : 0)
 
#define AtapiVirtToPhysAddr(hwde, srb, phaddr, plen, phaddru)    AtapiVirtToPhysAddr_(hwde, srb, phaddr, plen, phaddru);
 
#define GET_CHANNEL(Srb)   (Srb->PathId)
 
#define GET_CDEV(Srb)   (Srb->TargetId)
 
#define VM_AUTO   0x00
 
#define VM_NONE   0x01
 
#define VM_VBOX   0x02
 
#define VM_VMWARE   0x03
 
#define VM_QEMU   0x04
 
#define VM_BOCHS   0x05
 
#define VM_PCEM   0x06
 
#define VM_MAX_KNOWN   VM_PCEM
 

Typedefs

typedef struct _BUSMASTER_CTX BUSMASTER_CTX
 
typedef struct _BUSMASTER_CTXPBUSMASTER_CTX
 
typedef struct BM_DMA_ENTRY BM_DMA_ENTRY
 
typedef struct BM_DMA_ENTRYPBM_DMA_ENTRY
 
typedef struct _IDE_BUSMASTER_REGISTERS IDE_BUSMASTER_REGISTERS
 
typedef struct _IDE_BUSMASTER_REGISTERSPIDE_BUSMASTER_REGISTERS
 
typedef struct _IDE_AHCI_REGISTERS IDE_AHCI_REGISTERS
 
typedef struct _IDE_AHCI_REGISTERSPIDE_AHCI_REGISTERS
 
typedef union _SATA_SSTATUS_REG SATA_SSTATUS_REG
 
typedef union _SATA_SSTATUS_REGPSATA_SSTATUS_REG
 
typedef union _SATA_SCONTROL_REG SATA_SCONTROL_REG
 
typedef union _SATA_SCONTROL_REGPSATA_SCONTROL_REG
 
typedef union _SATA_SERROR_REG SATA_SERROR_REG
 
typedef union _SATA_SERROR_REGPSATA_SERROR_REG
 
typedef struct _IDE_SATA_REGISTERS IDE_SATA_REGISTERS
 
typedef struct _IDE_SATA_REGISTERSPIDE_SATA_REGISTERS
 
typedef union _AHCI_IS_REG AHCI_IS_REG
 
typedef union _AHCI_IS_REGPAHCI_IS_REG
 
typedef struct _IDE_AHCI_PORT_REGISTERS IDE_AHCI_PORT_REGISTERS
 
typedef struct _IDE_AHCI_PORT_REGISTERSPIDE_AHCI_PORT_REGISTERS
 
typedef struct _IDE_AHCI_PRD_ENTRY IDE_AHCI_PRD_ENTRY
 
typedef struct _IDE_AHCI_PRD_ENTRYPIDE_AHCI_PRD_ENTRY
 
typedef struct _AHCI_ATA_H2D_FIS AHCI_ATA_H2D_FIS
 
typedef struct _AHCI_ATA_H2D_FISPAHCI_ATA_H2D_FIS
 
typedef struct _IDE_AHCI_CMD IDE_AHCI_CMD
 
typedef struct _IDE_AHCI_CMDPIDE_AHCI_CMD
 
typedef struct _IDE_AHCI_CMD_LIST IDE_AHCI_CMD_LIST
 
typedef struct _IDE_AHCI_CMD_LISTPIDE_AHCI_CMD_LIST
 
typedef struct _IDE_AHCI_RCV_FIS IDE_AHCI_RCV_FIS
 
typedef struct _IDE_AHCI_RCV_FISPIDE_AHCI_RCV_FIS
 
typedef struct _IDE_AHCI_CHANNEL_CTL_BLOCK IDE_AHCI_CHANNEL_CTL_BLOCK
 
typedef struct _IDE_AHCI_CHANNEL_CTL_BLOCKPIDE_AHCI_CHANNEL_CTL_BLOCK
 
typedef union _ATA_REQ ATA_REQ
 
typedef union _ATA_REQPATA_REQ
 
typedef struct _IORES IORES
 
typedef struct _IORESPIORES
 
typedef struct _HW_CHANNEL HW_CHANNEL
 
typedef struct _HW_CHANNELPHW_CHANNEL
 
typedef struct _HW_LU_EXTENSION HW_LU_EXTENSION
 
typedef struct _HW_LU_EXTENSIONPHW_LU_EXTENSION
 
typedef struct _HW_DEVICE_EXTENSION HW_DEVICE_EXTENSION
 
typedef struct _HW_DEVICE_EXTENSIONPHW_DEVICE_EXTENSION
 
typedef struct _ISR2_DEVICE_EXTENSION ISR2_DEVICE_EXTENSION
 
typedef struct _ISR2_DEVICE_EXTENSIONPISR2_DEVICE_EXTENSION
 
typedef ISR2_DEVICE_EXTENSION PCIIDE_DEVICE_EXTENSION
 
typedef PISR2_DEVICE_EXTENSION PPCIIDE_DEVICE_EXTENSION
 

Functions

VOID NTAPI UniataEnumBusMasterController (IN PVOID DriverObject, PVOID Argument2)
 
ULONG NTAPI UniataFindCompatBusMasterController1 (IN PVOID HwDeviceExtension, IN PVOID Context, IN PVOID BusInformation, IN PCHAR ArgumentString, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, OUT PBOOLEAN Again)
 
ULONG NTAPI UniataFindCompatBusMasterController2 (IN PVOID HwDeviceExtension, IN PVOID Context, IN PVOID BusInformation, IN PCHAR ArgumentString, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, OUT PBOOLEAN Again)
 
BOOLEAN NTAPI UniataAllocateLunExt (PHW_DEVICE_EXTENSION deviceExtension, ULONG NewNumberChannels)
 
VOID NTAPI UniataFreeLunExt (PHW_DEVICE_EXTENSION deviceExtension)
 
ULONG NTAPI UniataFindBusMasterController (IN PVOID HwDeviceExtension, IN PVOID Context, IN PVOID BusInformation, IN PCHAR ArgumentString, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, OUT PBOOLEAN Again)
 
NTSTATUS NTAPI UniataClaimLegacyPCIIDE (ULONG i)
 
NTSTATUS NTAPI UniataConnectIntr2 (IN PVOID HwDeviceExtension)
 
NTSTATUS NTAPI UniataDisconnectIntr2 (IN PVOID HwDeviceExtension)
 
ULONG NTAPI ScsiPortGetBusDataByOffset (IN PVOID HwDeviceExtension, IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
 
ULONG NTAPI AtapiFindListedDev (PBUSMASTER_CONTROLLER_INFORMATION_BASE BusMasterAdapters, ULONG lim, IN PVOID HwDeviceExtension, IN ULONG BusNumber, IN ULONG SlotNumber, OUT PCI_SLOT_NUMBER *_slotData)
 
ULONG NTAPI AtapiFindDev (IN PVOID HwDeviceExtension, IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN ULONG dev_id, IN ULONG RevID)
 
VOID NTAPI AtapiDmaAlloc (IN PVOID HwDeviceExtension, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN ULONG lChannel)
 
BOOLEAN NTAPI AtapiDmaSetup (IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG lChannel, IN PSCSI_REQUEST_BLOCK Srb, IN PUCHAR data, IN ULONG count)
 
BOOLEAN NTAPI AtapiDmaPioSync (PVOID HwDeviceExtension, PSCSI_REQUEST_BLOCK Srb, PUCHAR data, ULONG count)
 
BOOLEAN NTAPI AtapiDmaDBSync (PHW_CHANNEL chan, PSCSI_REQUEST_BLOCK Srb)
 
BOOLEAN NTAPI AtapiDmaDBPreSync (IN PVOID HwDeviceExtension, PHW_CHANNEL chan, PSCSI_REQUEST_BLOCK Srb)
 
VOID NTAPI AtapiDmaStart (IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG lChannel, IN PSCSI_REQUEST_BLOCK Srb)
 
UCHAR NTAPI AtapiDmaDone (IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG lChannel, IN PSCSI_REQUEST_BLOCK Srb)
 
VOID NTAPI AtapiDmaReinit (IN PHW_DEVICE_EXTENSION deviceExtension, IN PHW_LU_EXTENSION LunExt, IN PATA_REQ AtaReq)
 
VOID NTAPI AtapiDmaInit__ (IN PHW_DEVICE_EXTENSION deviceExtension, IN PHW_LU_EXTENSION LunExt)
 
VOID NTAPI AtapiDmaInit (IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG lChannel, IN SCHAR apiomode, IN SCHAR wdmamode, IN SCHAR udmamode)
 
BOOLEAN NTAPI AtapiInterrupt2 (IN PKINTERRUPT Interrupt, IN PVOID HwDeviceExtension)
 
BOOLEAN NTAPI UniataChipDetectChannels (IN PVOID HwDeviceExtension, IN PPCI_COMMON_CONFIG pciData, IN ULONG DeviceNumber, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo)
 
NTSTATUS NTAPI UniataChipDetect (IN PVOID HwDeviceExtension, IN PPCI_COMMON_CONFIG pciData, IN ULONG DeviceNumber, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN BOOLEAN *simplexOnly)
 
BOOLEAN NTAPI AtapiChipInit (IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG c)
 
ULONGIO_PTR NTAPI AtapiGetIoRange (IN PVOID HwDeviceExtension, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN PPCI_COMMON_CONFIG pciData, IN ULONG SystemIoBusNumber, IN ULONG rid, IN ULONG offset, IN ULONG length)
 
USHORT NTAPI UniataEnableIoPCI (IN ULONG busNumber, IN ULONG slotNumber, IN OUT PPCI_COMMON_CONFIG pciData)
 
VOID DDKFASTAPI AtapiWritePort4 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG data)
 
VOID DDKFASTAPI AtapiWritePort2 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN USHORT data)
 
VOID DDKFASTAPI AtapiWritePort1 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN UCHAR data)
 
VOID DDKFASTAPI AtapiWritePortEx4 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs, IN ULONG data)
 
VOID DDKFASTAPI AtapiWritePortEx1 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs, IN UCHAR data)
 
ULONG DDKFASTAPI AtapiReadPort4 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port)
 
USHORT DDKFASTAPI AtapiReadPort2 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port)
 
UCHAR DDKFASTAPI AtapiReadPort1 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port)
 
ULONG DDKFASTAPI AtapiReadPortEx4 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs)
 
UCHAR DDKFASTAPI AtapiReadPortEx1 (IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs)
 
VOID DDKFASTAPI AtapiWriteBuffer4 (IN PHW_CHANNEL chan, IN ULONGIO_PTR _port, IN PVOID Buffer, IN ULONG Count, IN ULONG Timing)
 
VOID DDKFASTAPI AtapiWriteBuffer2 (IN PHW_CHANNEL chan, IN ULONGIO_PTR _port, IN PVOID Buffer, IN ULONG Count, IN ULONG Timing)
 
VOID DDKFASTAPI AtapiReadBuffer4 (IN PHW_CHANNEL chan, IN ULONGIO_PTR _port, IN PVOID Buffer, IN ULONG Count, IN ULONG Timing)
 
VOID DDKFASTAPI AtapiReadBuffer2 (IN PHW_CHANNEL chan, IN ULONGIO_PTR _port, IN PVOID Buffer, IN ULONG Count, IN ULONG Timing)
 
VOID NTAPI AtapiSetupLunPtrs (IN PHW_CHANNEL chan, IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG c)
 
BOOLEAN NTAPI AtapiReadChipConfig (IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG channel)
 
VOID NTAPI UniataForgetDevice (PHW_LU_EXTENSION LunExt)
 

Variables

UCHAR pciBuffer [256]
 
PBUSMASTER_CONTROLLER_INFORMATION BMList
 
ULONG BMListLen
 
ULONG IsaCount
 
ULONG MCACount
 
UNICODE_STRING SavedRegPath
 
PDRIVER_OBJECT SavedDriverObject
 
ULONG SkipRaids
 
ULONG ForceSimplex
 
BOOLEAN g_opt_AtapiDmaRawRead
 
BOOLEAN hasPCI
 
BOOLEAN InDriverEntry
 
BOOLEAN g_Dump
 
BOOLEAN g_opt_Verbose
 
ULONG g_opt_VirtualMachine
 
ULONG g_opt_WaitBusyResetCount
 
ULONG CPU_num
 
BOOLEAN WinVer_WDM_Model
 

Macro Definition Documentation

◆ AHCI_BOHC_BB

#define AHCI_BOHC_BB   0x00000001

Definition at line 259 of file bsmaster.h.

◆ AHCI_BOHC_BOS

#define AHCI_BOHC_BOS   0x00000010

Definition at line 263 of file bsmaster.h.

◆ AHCI_BOHC_OOC

#define AHCI_BOHC_OOC   0x00000002

Definition at line 260 of file bsmaster.h.

◆ AHCI_BOHC_OOS

#define AHCI_BOHC_OOS   0x00000008

Definition at line 262 of file bsmaster.h.

◆ AHCI_BOHC_SOOE

#define AHCI_BOHC_SOOE   0x00000004

Definition at line 261 of file bsmaster.h.

◆ AHCI_CAP2_APST

#define AHCI_CAP2_APST   0x00000004

Definition at line 247 of file bsmaster.h.

◆ AHCI_CAP2_BOH

#define AHCI_CAP2_BOH   0x00000001

Definition at line 245 of file bsmaster.h.

◆ AHCI_CAP2_NVMP

#define AHCI_CAP2_NVMP   0x00000002

Definition at line 246 of file bsmaster.h.

◆ AHCI_CAP_CCC

#define AHCI_CAP_CCC   0x00000080

Definition at line 201 of file bsmaster.h.

◆ AHCI_CAP_ISS_MASK

#define AHCI_CAP_ISS_MASK   0x00f00000

Definition at line 206 of file bsmaster.h.

◆ AHCI_CAP_NCQ

#define AHCI_CAP_NCQ   0x40000000

Definition at line 209 of file bsmaster.h.

◆ AHCI_CAP_NCS_MASK

#define AHCI_CAP_NCS_MASK   0x00001f00

Definition at line 202 of file bsmaster.h.

◆ AHCI_CAP_NOP_MASK

#define AHCI_CAP_NOP_MASK   0x0000001f

Definition at line 200 of file bsmaster.h.

◆ AHCI_CAP_PMD

#define AHCI_CAP_PMD   0x00008000

Definition at line 203 of file bsmaster.h.

◆ AHCI_CAP_S64A

#define AHCI_CAP_S64A   0x80000000

Definition at line 210 of file bsmaster.h.

◆ AHCI_CAP_SAM

#define AHCI_CAP_SAM   0x00040000

Definition at line 205 of file bsmaster.h.

◆ AHCI_CAP_SCLO

#define AHCI_CAP_SCLO   0x01000000

Definition at line 207 of file bsmaster.h.

◆ AHCI_CAP_SNTF

#define AHCI_CAP_SNTF   0x20000000

Definition at line 208 of file bsmaster.h.

◆ AHCI_CAP_SPM

#define AHCI_CAP_SPM   0x00020000

Definition at line 204 of file bsmaster.h.

◆ AHCI_CLB_ALIGNEMENT_MASK

#define AHCI_CLB_ALIGNEMENT_MASK   ((ULONGLONG)(1024-1))

Definition at line 518 of file bsmaster.h.

◆ AHCI_CMD_ALIGNEMENT_MASK

#define AHCI_CMD_ALIGNEMENT_MASK   ((ULONGLONG)(128-1))

Definition at line 520 of file bsmaster.h.

◆ AHCI_DEV_SEL_1

#define AHCI_DEV_SEL_1   0x00

Definition at line 801 of file bsmaster.h.

◆ AHCI_DEV_SEL_2

#define AHCI_DEV_SEL_2   0x01

Definition at line 802 of file bsmaster.h.

◆ AHCI_DEV_SEL_PM

#define AHCI_DEV_SEL_PM   0x0f

Definition at line 803 of file bsmaster.h.

◆ AHCI_FIS_ALIGNEMENT_MASK

#define AHCI_FIS_ALIGNEMENT_MASK   ((ULONGLONG)(256-1))

Definition at line 519 of file bsmaster.h.

◆ AHCI_FIS_COMM_PM

#define AHCI_FIS_COMM_PM   (0x80 | AHCI_DEV_SEL_PM)

Definition at line 799 of file bsmaster.h.

◆ AHCI_FIS_TYPE_ATA_D2H

#define AHCI_FIS_TYPE_ATA_D2H   0x34

Definition at line 753 of file bsmaster.h.

◆ AHCI_FIS_TYPE_ATA_H2D

#define AHCI_FIS_TYPE_ATA_H2D   0x27

Definition at line 752 of file bsmaster.h.

◆ AHCI_FIS_TYPE_BIST_BiDi

#define AHCI_FIS_TYPE_BIST_BiDi   0x58

Definition at line 757 of file bsmaster.h.

◆ AHCI_FIS_TYPE_DATA_BiDi

#define AHCI_FIS_TYPE_DATA_BiDi   0x46

Definition at line 756 of file bsmaster.h.

◆ AHCI_FIS_TYPE_DEV_BITS_D2H

#define AHCI_FIS_TYPE_DEV_BITS_D2H   0xA1

Definition at line 759 of file bsmaster.h.

◆ AHCI_FIS_TYPE_DMA_BiDi

#define AHCI_FIS_TYPE_DMA_BiDi   0x41

Definition at line 755 of file bsmaster.h.

◆ AHCI_FIS_TYPE_DMA_D2H

#define AHCI_FIS_TYPE_DMA_D2H   0x39

Definition at line 754 of file bsmaster.h.

◆ AHCI_FIS_TYPE_PIO_D2H

#define AHCI_FIS_TYPE_PIO_D2H   0x5f

Definition at line 758 of file bsmaster.h.

◆ AHCI_GHC

#define AHCI_GHC   0x04

Definition at line 220 of file bsmaster.h.

◆ AHCI_GHC_AE

#define AHCI_GHC_AE   0x80000000

Definition at line 223 of file bsmaster.h.

◆ AHCI_GHC_HR

#define AHCI_GHC_HR   0x00000001

Definition at line 221 of file bsmaster.h.

◆ AHCI_GHC_IE

#define AHCI_GHC_IE   0x00000002

Definition at line 222 of file bsmaster.h.

◆ AHCI_MAX_PORT

#define AHCI_MAX_PORT   32

Definition at line 108 of file bsmaster.h.

◆ ATA_ACTIVE

#define ATA_ACTIVE   0x4

Definition at line 58 of file bsmaster.h.

◆ ATA_ACTIVE_ATA

#define ATA_ACTIVE_ATA   0x5

Definition at line 59 of file bsmaster.h.

◆ ATA_ACTIVE_ATAPI

#define ATA_ACTIVE_ATAPI   0x6

Definition at line 60 of file bsmaster.h.

◆ ATA_AHCI_CMD_ATAPI

#define ATA_AHCI_CMD_ATAPI   0x0020

Definition at line 815 of file bsmaster.h.

◆ ATA_AHCI_CMD_BIST

#define ATA_AHCI_CMD_BIST   0x0200

Definition at line 819 of file bsmaster.h.

◆ ATA_AHCI_CMD_CLR_BUSY

#define ATA_AHCI_CMD_CLR_BUSY   0x0400

Definition at line 820 of file bsmaster.h.

◆ ATA_AHCI_CMD_PREFETCH

#define ATA_AHCI_CMD_PREFETCH   0x0080

Definition at line 817 of file bsmaster.h.

◆ ATA_AHCI_CMD_RESET

#define ATA_AHCI_CMD_RESET   0x0100

Definition at line 818 of file bsmaster.h.

◆ ATA_AHCI_CMD_WRITE

#define ATA_AHCI_CMD_WRITE   0x0040

Definition at line 816 of file bsmaster.h.

◆ ATA_AHCI_DMA_ENTRIES

#define ATA_AHCI_DMA_ENTRIES   (PAGE_SIZE/2/sizeof(IDE_AHCI_PRD_ENTRY)) /* 128 */

Definition at line 749 of file bsmaster.h.

◆ ATA_AHCI_MAX_TAGS

#define ATA_AHCI_MAX_TAGS   32

Definition at line 750 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ACTIVE

#define ATA_AHCI_P_CMD_ACTIVE   0x10000000

Definition at line 719 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ALPE

#define ATA_AHCI_P_CMD_ALPE   0x04000000

Definition at line 715 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ASP

#define ATA_AHCI_P_CMD_ASP   0x08000000

Definition at line 716 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ATAPI

#define ATA_AHCI_P_CMD_ATAPI   0x01000000

Definition at line 713 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_CCS_MASK

#define ATA_AHCI_P_CMD_CCS_MASK   0x00001f00

Definition at line 703 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_CLO

#define ATA_AHCI_P_CMD_CLO   0x00000008

Definition at line 701 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_CPD

#define ATA_AHCI_P_CMD_CPD   0x00100000

Definition at line 711 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_CPS

#define ATA_AHCI_P_CMD_CPS   0x00010000

Definition at line 707 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_CR

#define ATA_AHCI_P_CMD_CR   0x00008000

Definition at line 706 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_DLAE

#define ATA_AHCI_P_CMD_DLAE   0x02000000

Definition at line 714 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ESP

#define ATA_AHCI_P_CMD_ESP   0x00200000

Definition at line 712 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_FR

#define ATA_AHCI_P_CMD_FR   0x00004000

Definition at line 705 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_FRE

#define ATA_AHCI_P_CMD_FRE   0x00000010

Definition at line 702 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_HPCP

#define ATA_AHCI_P_CMD_HPCP   0x00040000

Definition at line 709 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ICC_MASK

#define ATA_AHCI_P_CMD_ICC_MASK   0xf0000000

Definition at line 717 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ISP

#define ATA_AHCI_P_CMD_ISP   0x00080000

Definition at line 710 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ISS

#define ATA_AHCI_P_CMD_ISS   0x00002000

Definition at line 704 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_NOOP

#define ATA_AHCI_P_CMD_NOOP   0x00000000

Definition at line 718 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_PARTIAL

#define ATA_AHCI_P_CMD_PARTIAL   0x20000000

Definition at line 720 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_PMA

#define ATA_AHCI_P_CMD_PMA   0x00020000

Definition at line 708 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_POD

#define ATA_AHCI_P_CMD_POD   0x00000004

Definition at line 700 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_SLUMBER

#define ATA_AHCI_P_CMD_SLUMBER   0x60000000

Definition at line 721 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_ST

#define ATA_AHCI_P_CMD_ST   0x00000001

Definition at line 698 of file bsmaster.h.

◆ ATA_AHCI_P_CMD_SUD

#define ATA_AHCI_P_CMD_SUD   0x00000002

Definition at line 699 of file bsmaster.h.

◆ ATA_AHCI_P_IX_CPD

#define ATA_AHCI_P_IX_CPD   0x80000000

Definition at line 516 of file bsmaster.h.

◆ ATA_AHCI_P_IX_DHR

#define ATA_AHCI_P_IX_DHR   0x00000001

Definition at line 499 of file bsmaster.h.

◆ ATA_AHCI_P_IX_DI

#define ATA_AHCI_P_IX_DI   0x00000080

Definition at line 506 of file bsmaster.h.

◆ ATA_AHCI_P_IX_DP

#define ATA_AHCI_P_IX_DP   0x00000020

Definition at line 504 of file bsmaster.h.

◆ ATA_AHCI_P_IX_DS

#define ATA_AHCI_P_IX_DS   0x00000004

Definition at line 501 of file bsmaster.h.

◆ ATA_AHCI_P_IX_HBD

#define ATA_AHCI_P_IX_HBD   0x10000000

Definition at line 513 of file bsmaster.h.

◆ ATA_AHCI_P_IX_HBF

#define ATA_AHCI_P_IX_HBF   0x20000000

Definition at line 514 of file bsmaster.h.

◆ ATA_AHCI_P_IX_IF

#define ATA_AHCI_P_IX_IF   0x08000000

Definition at line 512 of file bsmaster.h.

◆ ATA_AHCI_P_IX_INF

#define ATA_AHCI_P_IX_INF   0x04000000

Definition at line 511 of file bsmaster.h.

◆ ATA_AHCI_P_IX_IPM

#define ATA_AHCI_P_IX_IPM   0x00800000

Definition at line 509 of file bsmaster.h.

◆ ATA_AHCI_P_IX_OF

#define ATA_AHCI_P_IX_OF   0x01000000

Definition at line 510 of file bsmaster.h.

◆ ATA_AHCI_P_IX_PC

#define ATA_AHCI_P_IX_PC   0x00000040

Definition at line 505 of file bsmaster.h.

◆ ATA_AHCI_P_IX_PRC

#define ATA_AHCI_P_IX_PRC   0x00400000

Definition at line 508 of file bsmaster.h.

◆ ATA_AHCI_P_IX_PS

#define ATA_AHCI_P_IX_PS   0x00000002

Definition at line 500 of file bsmaster.h.

◆ ATA_AHCI_P_IX_SDB

#define ATA_AHCI_P_IX_SDB   0x00000008

Definition at line 502 of file bsmaster.h.

◆ ATA_AHCI_P_IX_TFE

#define ATA_AHCI_P_IX_TFE   0x40000000

Definition at line 515 of file bsmaster.h.

◆ ATA_AHCI_P_IX_UF

#define ATA_AHCI_P_IX_UF   0x00000010

Definition at line 503 of file bsmaster.h.

◆ ATA_ALTIOSIZE

#define ATA_ALTIOSIZE   0x01 /* alternate registers size */

Definition at line 89 of file bsmaster.h.

◆ ATA_ALTOFFSET

#define ATA_ALTOFFSET   0x206 /* alternate registers offset */

Definition at line 87 of file bsmaster.h.

◆ ATA_BM_OFFSET1

#define ATA_BM_OFFSET1   0x08

Definition at line 85 of file bsmaster.h.

◆ ATA_BMIOSIZE

#define ATA_BMIOSIZE   0x20

Definition at line 90 of file bsmaster.h.

◆ ATA_DMA_ENTRIES

#define ATA_DMA_ENTRIES   256 /* PAGESIZE/2/sizeof(BM_DMA_ENTRY)*/

Definition at line 100 of file bsmaster.h.

◆ ATA_DMA_EOT

#define ATA_DMA_EOT   0x80000000

Definition at line 101 of file bsmaster.h.

◆ ATA_IDLE

#define ATA_IDLE   0x0

Definition at line 54 of file bsmaster.h.

◆ ATA_IMMEDIATE

#define ATA_IMMEDIATE   0x1

Definition at line 55 of file bsmaster.h.

◆ ATA_IOSIZE

#define ATA_IOSIZE   0x08

Definition at line 86 of file bsmaster.h.

◆ ATA_MAX_IOLBA28

#define ATA_MAX_IOLBA28   DEF_U64(0x0fffff80)

Definition at line 94 of file bsmaster.h.

◆ ATA_MAX_IOLBA32

#define ATA_MAX_IOLBA32   DEF_U64(0xffffff80)

Definition at line 97 of file bsmaster.h.

◆ ATA_MAX_LBA28

#define ATA_MAX_LBA28   DEF_U64(0x0fffffff)

Definition at line 95 of file bsmaster.h.

◆ ATA_MAX_LBA32

#define ATA_MAX_LBA32   DEF_U64(0xffffffff)

Definition at line 98 of file bsmaster.h.

◆ ATA_PC98_BANKIOSIZE

#define ATA_PC98_BANKIOSIZE   0x01

Definition at line 91 of file bsmaster.h.

◆ ATA_PCCARD_ALTOFFSET

#define ATA_PCCARD_ALTOFFSET   0x0e /* do for PCCARD devices */

Definition at line 88 of file bsmaster.h.

◆ ATA_REINITING

#define ATA_REINITING   0x7

Definition at line 61 of file bsmaster.h.

◆ ATA_SC_DET_DISABLE

#define ATA_SC_DET_DISABLE   0x00000004

Definition at line 361 of file bsmaster.h.

◆ ATA_SC_DET_IDLE

#define ATA_SC_DET_IDLE   0x00000000

Definition at line 359 of file bsmaster.h.

◆ ATA_SC_DET_MASK

#define ATA_SC_DET_MASK   0x0000000f

Definition at line 358 of file bsmaster.h.

◆ ATA_SC_DET_RESET

#define ATA_SC_DET_RESET   0x00000001

Definition at line 360 of file bsmaster.h.

◆ ATA_SC_IPM_DIS_PARTIAL

#define ATA_SC_IPM_DIS_PARTIAL   0x00000100

Definition at line 371 of file bsmaster.h.

◆ ATA_SC_IPM_DIS_SLUMBER

#define ATA_SC_IPM_DIS_SLUMBER   0x00000200

Definition at line 372 of file bsmaster.h.

◆ ATA_SC_IPM_MASK

#define ATA_SC_IPM_MASK   0x00000f00

Definition at line 369 of file bsmaster.h.

◆ ATA_SC_IPM_NONE

#define ATA_SC_IPM_NONE   0x00000000

Definition at line 370 of file bsmaster.h.

◆ ATA_SC_SPD_MASK

#define ATA_SC_SPD_MASK   0x000000f0

Definition at line 363 of file bsmaster.h.

◆ ATA_SC_SPD_NO_SPEED

#define ATA_SC_SPD_NO_SPEED   0x00000000

Definition at line 364 of file bsmaster.h.

◆ ATA_SC_SPD_SPEED_GEN1

#define ATA_SC_SPD_SPEED_GEN1   0x00000010

Definition at line 365 of file bsmaster.h.

◆ ATA_SC_SPD_SPEED_GEN2

#define ATA_SC_SPD_SPEED_GEN2   0x00000020

Definition at line 366 of file bsmaster.h.

◆ ATA_SC_SPD_SPEED_GEN3

#define ATA_SC_SPD_SPEED_GEN3   0x00000040

Definition at line 367 of file bsmaster.h.

◆ ATA_SE_COMM_CORRECTED

#define ATA_SE_COMM_CORRECTED   0x00000002

Definition at line 410 of file bsmaster.h.

◆ ATA_SE_COMM_ERR

#define ATA_SE_COMM_ERR   0x00000200

Definition at line 412 of file bsmaster.h.

◆ ATA_SE_COMM_WAKE

#define ATA_SE_COMM_WAKE   0x00040000

Definition at line 417 of file bsmaster.h.

◆ ATA_SE_CRC_ERR

#define ATA_SE_CRC_ERR   0x00200000

Definition at line 420 of file bsmaster.h.

◆ ATA_SE_DATA_CORRECTED

#define ATA_SE_DATA_CORRECTED   0x00000001

Definition at line 409 of file bsmaster.h.

◆ ATA_SE_DATA_ERR

#define ATA_SE_DATA_ERR   0x00000100

Definition at line 411 of file bsmaster.h.

◆ ATA_SE_DECODE_ERR

#define ATA_SE_DECODE_ERR   0x00080000

Definition at line 418 of file bsmaster.h.

◆ ATA_SE_HANDSHAKE_ERR

#define ATA_SE_HANDSHAKE_ERR   0x00400000

Definition at line 421 of file bsmaster.h.

◆ ATA_SE_HOST_ERR

#define ATA_SE_HOST_ERR   0x00000800

Definition at line 414 of file bsmaster.h.

◆ ATA_SE_LINKSEQ_ERR

#define ATA_SE_LINKSEQ_ERR   0x00800000

Definition at line 422 of file bsmaster.h.

◆ ATA_SE_PARITY_ERR

#define ATA_SE_PARITY_ERR   0x00100000

Definition at line 419 of file bsmaster.h.

◆ ATA_SE_PHY_CHANGED

#define ATA_SE_PHY_CHANGED   0x00010000

Definition at line 415 of file bsmaster.h.

◆ ATA_SE_PHY_IERROR

#define ATA_SE_PHY_IERROR   0x00020000

Definition at line 416 of file bsmaster.h.

◆ ATA_SE_PROT_ERR

#define ATA_SE_PROT_ERR   0x00000400

Definition at line 413 of file bsmaster.h.

◆ ATA_SE_TRANSPORT_ERR

#define ATA_SE_TRANSPORT_ERR   0x01000000

Definition at line 423 of file bsmaster.h.

◆ ATA_SE_UNKNOWN_FIS

#define ATA_SE_UNKNOWN_FIS   0x02000000

Definition at line 424 of file bsmaster.h.

◆ ATA_SS_DET_DEV_PRESENT

#define ATA_SS_DET_DEV_PRESENT   0x00000001

Definition at line 311 of file bsmaster.h.

◆ ATA_SS_DET_MASK

#define ATA_SS_DET_MASK   0x0000000f

Definition at line 309 of file bsmaster.h.

◆ ATA_SS_DET_NO_DEVICE

#define ATA_SS_DET_NO_DEVICE   0x00000000

Definition at line 310 of file bsmaster.h.

◆ ATA_SS_DET_PHY_OFFLINE

#define ATA_SS_DET_PHY_OFFLINE   0x00000004

Definition at line 313 of file bsmaster.h.

◆ ATA_SS_DET_PHY_ONLINE

#define ATA_SS_DET_PHY_ONLINE   0x00000003

Definition at line 312 of file bsmaster.h.

◆ ATA_SS_IPM_ACTIVE

#define ATA_SS_IPM_ACTIVE   0x00000100

Definition at line 322 of file bsmaster.h.

◆ ATA_SS_IPM_MASK

#define ATA_SS_IPM_MASK   0x00000f00

Definition at line 320 of file bsmaster.h.

◆ ATA_SS_IPM_NO_DEVICE

#define ATA_SS_IPM_NO_DEVICE   0x00000000

Definition at line 321 of file bsmaster.h.

◆ ATA_SS_IPM_PARTIAL

#define ATA_SS_IPM_PARTIAL   0x00000200

Definition at line 323 of file bsmaster.h.

◆ ATA_SS_IPM_SLUMBER

#define ATA_SS_IPM_SLUMBER   0x00000600

Definition at line 324 of file bsmaster.h.

◆ ATA_SS_SPD_GEN1

#define ATA_SS_SPD_GEN1   0x00000010

Definition at line 317 of file bsmaster.h.

◆ ATA_SS_SPD_GEN2

#define ATA_SS_SPD_GEN2   0x00000020

Definition at line 318 of file bsmaster.h.

◆ ATA_SS_SPD_MASK

#define ATA_SS_SPD_MASK   0x000000f0

Definition at line 315 of file bsmaster.h.

◆ ATA_SS_SPD_NO_SPEED

#define ATA_SS_SPD_NO_SPEED   0x00000000

Definition at line 316 of file bsmaster.h.

◆ ATA_WAIT_BASE_READY

#define ATA_WAIT_BASE_READY   0x8

Definition at line 62 of file bsmaster.h.

◆ ATA_WAIT_IDLE

#define ATA_WAIT_IDLE   0x9

Definition at line 63 of file bsmaster.h.

◆ ATA_WAIT_INTR

#define ATA_WAIT_INTR   0x2

Definition at line 56 of file bsmaster.h.

◆ ATA_WAIT_READY

#define ATA_WAIT_READY   0x3

Definition at line 57 of file bsmaster.h.

◆ ATAPI_MAGIC_LSB

#define ATAPI_MAGIC_LSB   0x14

Definition at line 105 of file bsmaster.h.

◆ ATAPI_MAGIC_MSB

#define ATAPI_MAGIC_MSB   0xeb

Definition at line 106 of file bsmaster.h.

◆ AtapiVirtToPhysAddr

#define AtapiVirtToPhysAddr (   hwde,
  srb,
  phaddr,
  plen,
  phaddru 
)     AtapiVirtToPhysAddr_(hwde, srb, phaddr, plen, phaddru);

Definition at line 1716 of file bsmaster.h.

◆ BM_COMMAND_READ

#define BM_COMMAND_READ   0x08

Definition at line 154 of file bsmaster.h.

◆ BM_COMMAND_START_STOP

#define BM_COMMAND_START_STOP   0x01

Definition at line 150 of file bsmaster.h.

◆ BM_COMMAND_WRITE

#define BM_COMMAND_WRITE   0x00

Definition at line 153 of file bsmaster.h.

◆ BM_DS0_SII_DMA_COMPLETE

#define BM_DS0_SII_DMA_COMPLETE   (1 << 18) /* cmd complete / IRQ pending */

Definition at line 160 of file bsmaster.h.

◆ BM_DS0_SII_DMA_ENABLE

#define BM_DS0_SII_DMA_ENABLE   (1 << 0) /* DMA run switch */

Definition at line 156 of file bsmaster.h.

◆ BM_DS0_SII_DMA_ERROR

#define BM_DS0_SII_DMA_ERROR   (1 << 17) /* PCI bus error */

Definition at line 159 of file bsmaster.h.

◆ BM_DS0_SII_DMA_SATA_IRQ

#define BM_DS0_SII_DMA_SATA_IRQ   (1 << 4) /* OR of all SATA IRQs */

Definition at line 158 of file bsmaster.h.

◆ BM_DS0_SII_IRQ

#define BM_DS0_SII_IRQ   (1 << 3) /* ??? */

Definition at line 157 of file bsmaster.h.

◆ BM_STATUS_ACTIVE

#define BM_STATUS_ACTIVE   0x01

Definition at line 142 of file bsmaster.h.

◆ BM_STATUS_DRIVE_0_DMA

#define BM_STATUS_DRIVE_0_DMA   0x20

Definition at line 146 of file bsmaster.h.

◆ BM_STATUS_DRIVE_1_DMA

#define BM_STATUS_DRIVE_1_DMA   0x40

Definition at line 147 of file bsmaster.h.

◆ BM_STATUS_ERR

#define BM_STATUS_ERR   0x02

Definition at line 143 of file bsmaster.h.

◆ BM_STATUS_INTR

#define BM_STATUS_INTR   0x04

Definition at line 144 of file bsmaster.h.

◆ BM_STATUS_MASK

#define BM_STATUS_MASK   0x07

Definition at line 145 of file bsmaster.h.

◆ BM_STATUS_SIMPLEX_ONLY

#define BM_STATUS_SIMPLEX_ONLY   0x80

Definition at line 148 of file bsmaster.h.

◆ ChangePciConfig1

#define ChangePciConfig1 (   offs,
  _op 
)
Value:
{ \
UCHAR a = 0; \
GetPciConfig1(offs, a); \
a = (UCHAR)(_op); \
SetPciConfig1(offs, a); \
}
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
unsigned char UCHAR
Definition: xmlstorage.h:181

Definition at line 1641 of file bsmaster.h.

◆ ChangePciConfig2

#define ChangePciConfig2 (   offs,
  _op 
)
Value:
{ \
USHORT a = 0; \
GetPciConfig2(offs, a); \
a = (USHORT)(_op); \
SetPciConfig2(offs, a); \
}
unsigned short USHORT
Definition: pedump.c:61

Definition at line 1670 of file bsmaster.h.

◆ ChangePciConfig4

#define ChangePciConfig4 (   offs,
  _op 
)
Value:
{ \
ULONG a = 0; \
GetPciConfig4(offs, a); \
a = _op; \
SetPciConfig4(offs, a); \
}
uint32_t ULONG
Definition: typedefs.h:59

Definition at line 1699 of file bsmaster.h.

◆ CHECK_INTR_ACTIVE

#define CHECK_INTR_ACTIVE   0x03

Definition at line 1066 of file bsmaster.h.

◆ CHECK_INTR_CHECK

#define CHECK_INTR_CHECK   0x01

Definition at line 1068 of file bsmaster.h.

◆ CHECK_INTR_DETECTED

#define CHECK_INTR_DETECTED   0x02

Definition at line 1067 of file bsmaster.h.

◆ CHECK_INTR_IDLE

#define CHECK_INTR_IDLE   0x00

Definition at line 1069 of file bsmaster.h.

◆ CMD_ACTION_ALL

#define CMD_ACTION_ALL   (CMD_ACTION_PREPARE | CMD_ACTION_EXEC)

Definition at line 976 of file bsmaster.h.

◆ CMD_ACTION_EXEC

#define CMD_ACTION_EXEC   0x02

Definition at line 975 of file bsmaster.h.

◆ CMD_ACTION_PREPARE

#define CMD_ACTION_PREPARE   0x01

Definition at line 974 of file bsmaster.h.

◆ CTRFLAGS_AHCI_PM

#define CTRFLAGS_AHCI_PM   0x0400

Definition at line 1143 of file bsmaster.h.

◆ CTRFLAGS_AHCI_PM2

#define CTRFLAGS_AHCI_PM2   0x0800

Definition at line 1144 of file bsmaster.h.

◆ CTRFLAGS_DMA_ACTIVE

#define CTRFLAGS_DMA_ACTIVE   0x0001

Definition at line 1131 of file bsmaster.h.

◆ CTRFLAGS_DMA_OPERATION

#define CTRFLAGS_DMA_OPERATION   0x0004

Definition at line 1133 of file bsmaster.h.

◆ CTRFLAGS_DMA_RO

#define CTRFLAGS_DMA_RO   0x0002

Definition at line 1132 of file bsmaster.h.

◆ CTRFLAGS_DPC_REQ

#define CTRFLAGS_DPC_REQ   0x0010

Definition at line 1135 of file bsmaster.h.

◆ CTRFLAGS_DSC_BSY

#define CTRFLAGS_DSC_BSY   0x0080

Definition at line 1138 of file bsmaster.h.

◆ CTRFLAGS_ENABLE_INTR_REQ

#define CTRFLAGS_ENABLE_INTR_REQ   0x0020

Definition at line 1136 of file bsmaster.h.

◆ CTRFLAGS_INTR_DISABLED

#define CTRFLAGS_INTR_DISABLED   0x0008

Definition at line 1134 of file bsmaster.h.

◆ CTRFLAGS_LBA48

#define CTRFLAGS_LBA48   0x0040

Definition at line 1137 of file bsmaster.h.

◆ CTRFLAGS_NO_SLAVE

#define CTRFLAGS_NO_SLAVE   0x0100

Definition at line 1139 of file bsmaster.h.

◆ CTRFLAGS_PERMANENT

#define CTRFLAGS_PERMANENT   (CTRFLAGS_DMA_RO | CTRFLAGS_NO_SLAVE)

Definition at line 1146 of file bsmaster.h.

◆ DEV_BSIZE

#define DEV_BSIZE   512

Definition at line 103 of file bsmaster.h.

◆ DMA_MODE_AHCI

#define DMA_MODE_AHCI   0x02

Definition at line 1708 of file bsmaster.h.

◆ DMA_MODE_BM

#define DMA_MODE_BM   0x01

Definition at line 1707 of file bsmaster.h.

◆ DMA_MODE_NONE

#define DMA_MODE_NONE   0x00

Definition at line 1706 of file bsmaster.h.

◆ DPC_STATE_COMPLETE

#define DPC_STATE_COMPLETE   0x40

Definition at line 1158 of file bsmaster.h.

◆ DPC_STATE_DPC

#define DPC_STATE_DPC   0x20

Definition at line 1156 of file bsmaster.h.

◆ DPC_STATE_ISR

#define DPC_STATE_ISR   0x10

Definition at line 1155 of file bsmaster.h.

◆ DPC_STATE_NONE

#define DPC_STATE_NONE   0x00

Definition at line 1154 of file bsmaster.h.

◆ DPC_STATE_TIMER

#define DPC_STATE_TIMER   0x30

Definition at line 1157 of file bsmaster.h.

◆ GEOM_AUTO

#define GEOM_AUTO   0xffffffff

Definition at line 1148 of file bsmaster.h.

◆ GEOM_MANUAL

#define GEOM_MANUAL   0x0003

Definition at line 1152 of file bsmaster.h.

◆ GEOM_ORIG

#define GEOM_ORIG   0x0002

Definition at line 1151 of file bsmaster.h.

◆ GEOM_STD

#define GEOM_STD   0x0000

Definition at line 1149 of file bsmaster.h.

◆ GEOM_UNIATA

#define GEOM_UNIATA   0x0001

Definition at line 1150 of file bsmaster.h.

◆ GET_CDEV

#define GET_CDEV (   Srb)    (Srb->TargetId)

Definition at line 1850 of file bsmaster.h.

◆ GET_CHANNEL

#define GET_CHANNEL (   Srb)    (Srb->PathId)

Definition at line 1847 of file bsmaster.h.

◆ GetDmaStatus

#define GetDmaStatus (   de,
  c 
)     (((de)->BusMaster == DMA_MODE_BM) ? AtapiReadPort1(&((de)->chan[c]), IDX_BM_Status) : 0)

Definition at line 1711 of file bsmaster.h.

◆ GetPciConfig1

#define GetPciConfig1 (   offs,
  op 
)
Value:
{ \
ScsiPortGetBusDataByOffset(HwDeviceExtension, \
SystemIoBusNumber, \
slotNumber, \
&op, \
offs, \
1); \
}
UINT op
Definition: effect.c:236
@ PCIConfiguration
Definition: miniport.h:93

Definition at line 1620 of file bsmaster.h.

◆ GetPciConfig2

#define GetPciConfig2 (   offs,
  op 
)
Value:
{ \
ScsiPortGetBusDataByOffset(HwDeviceExtension, \
SystemIoBusNumber, \
slotNumber, \
&op, \
offs, \
2); \
}

Definition at line 1649 of file bsmaster.h.

◆ GetPciConfig4

#define GetPciConfig4 (   offs,
  op 
)
Value:
{ \
ScsiPortGetBusDataByOffset(HwDeviceExtension, \
SystemIoBusNumber, \
slotNumber, \
&op, \
offs, \
4); \
}

Definition at line 1678 of file bsmaster.h.

◆ HBAFLAGS_DMA_DISABLED

#define HBAFLAGS_DMA_DISABLED   0x01

Definition at line 1358 of file bsmaster.h.

◆ HBAFLAGS_DMA_DISABLED_LBA48

#define HBAFLAGS_DMA_DISABLED_LBA48   0x02

Definition at line 1359 of file bsmaster.h.

◆ IDX_AHCI_BOHC

#define IDX_AHCI_BOHC   (FIELD_OFFSET(IDE_AHCI_REGISTERS, BOHC))

Definition at line 276 of file bsmaster.h.

◆ IDX_AHCI_CAP

#define IDX_AHCI_CAP   (FIELD_OFFSET(IDE_AHCI_REGISTERS, CAP))

Definition at line 270 of file bsmaster.h.

◆ IDX_AHCI_CAP2

#define IDX_AHCI_CAP2   (FIELD_OFFSET(IDE_AHCI_REGISTERS, CAP2))

Definition at line 275 of file bsmaster.h.

◆ IDX_AHCI_GHC

#define IDX_AHCI_GHC   (FIELD_OFFSET(IDE_AHCI_REGISTERS, GHC))

Definition at line 271 of file bsmaster.h.

◆ IDX_AHCI_IS

#define IDX_AHCI_IS   (FIELD_OFFSET(IDE_AHCI_REGISTERS, IS))

Definition at line 272 of file bsmaster.h.

◆ IDX_AHCI_o_BlockCount

#define IDX_AHCI_o_BlockCount   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockCount))

Definition at line 791 of file bsmaster.h.

◆ IDX_AHCI_o_BlockCountExp

#define IDX_AHCI_o_BlockCountExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockCountExp))

Definition at line 797 of file bsmaster.h.

◆ IDX_AHCI_o_BlockNumber

#define IDX_AHCI_o_BlockNumber   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockNumber ))

Definition at line 787 of file bsmaster.h.

◆ IDX_AHCI_o_BlockNumberExp

#define IDX_AHCI_o_BlockNumberExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, BlockNumberExp ))

Definition at line 794 of file bsmaster.h.

◆ IDX_AHCI_o_Command

#define IDX_AHCI_o_Command   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, Command))

Definition at line 785 of file bsmaster.h.

◆ IDX_AHCI_o_Control

#define IDX_AHCI_o_Control   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, Control))

Definition at line 792 of file bsmaster.h.

◆ IDX_AHCI_o_CylinderHigh

#define IDX_AHCI_o_CylinderHigh   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderHigh))

Definition at line 789 of file bsmaster.h.

◆ IDX_AHCI_o_CylinderHighExp

#define IDX_AHCI_o_CylinderHighExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderHighExp))

Definition at line 796 of file bsmaster.h.

◆ IDX_AHCI_o_CylinderLow

#define IDX_AHCI_o_CylinderLow   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderLow ))

Definition at line 788 of file bsmaster.h.

◆ IDX_AHCI_o_CylinderLowExp

#define IDX_AHCI_o_CylinderLowExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, CylinderLowExp ))

Definition at line 795 of file bsmaster.h.

◆ IDX_AHCI_o_DriveSelect

#define IDX_AHCI_o_DriveSelect   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, DriveSelect ))

Definition at line 790 of file bsmaster.h.

◆ IDX_AHCI_o_Feature

#define IDX_AHCI_o_Feature   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, Feature))

Definition at line 786 of file bsmaster.h.

◆ IDX_AHCI_o_FeatureExp

#define IDX_AHCI_o_FeatureExp   (FIELD_OFFSET(AHCI_ATA_H2D_FIS, FeatureExp))

Definition at line 793 of file bsmaster.h.

◆ IDX_AHCI_P_ACT

#define IDX_AHCI_P_ACT   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SACT))

Definition at line 693 of file bsmaster.h.

◆ IDX_AHCI_P_CI

#define IDX_AHCI_P_CI   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CI))

Definition at line 686 of file bsmaster.h.

◆ IDX_AHCI_P_CLB

#define IDX_AHCI_P_CLB   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CLB))

Definition at line 682 of file bsmaster.h.

◆ IDX_AHCI_P_CMD

#define IDX_AHCI_P_CMD   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CMD))

Definition at line 689 of file bsmaster.h.

◆ IDX_AHCI_P_FB

#define IDX_AHCI_P_FB   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, FB))

Definition at line 683 of file bsmaster.h.

◆ IDX_AHCI_P_IE

#define IDX_AHCI_P_IE   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IE))

Definition at line 685 of file bsmaster.h.

◆ IDX_AHCI_P_IS

#define IDX_AHCI_P_IS   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IS))

Definition at line 684 of file bsmaster.h.

◆ IDX_AHCI_P_SControl

#define IDX_AHCI_P_SControl   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SControl))

Definition at line 691 of file bsmaster.h.

◆ IDX_AHCI_P_SError

#define IDX_AHCI_P_SError   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SError))

Definition at line 692 of file bsmaster.h.

◆ IDX_AHCI_P_SIG

#define IDX_AHCI_P_SIG   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG))

Definition at line 688 of file bsmaster.h.

◆ IDX_AHCI_P_SNTF

#define IDX_AHCI_P_SNTF   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SNTF))

Definition at line 695 of file bsmaster.h.

◆ IDX_AHCI_P_SStatus

#define IDX_AHCI_P_SStatus   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SStatus))

Definition at line 690 of file bsmaster.h.

◆ IDX_AHCI_P_TFD

#define IDX_AHCI_P_TFD   (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD))

Definition at line 687 of file bsmaster.h.

◆ IDX_AHCI_PI

#define IDX_AHCI_PI   (FIELD_OFFSET(IDE_AHCI_REGISTERS, PI))

Definition at line 274 of file bsmaster.h.

◆ IDX_AHCI_VS

#define IDX_AHCI_VS   (FIELD_OFFSET(IDE_AHCI_REGISTERS, VS))

Definition at line 273 of file bsmaster.h.

◆ IDX_BM_Command

Definition at line 167 of file bsmaster.h.

◆ IDX_BM_DeviceSpecific0

#define IDX_BM_DeviceSpecific0   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific0)+IDX_BM_IO)

Definition at line 168 of file bsmaster.h.

◆ IDX_BM_DeviceSpecific1

#define IDX_BM_DeviceSpecific1   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific1)+IDX_BM_IO)

Definition at line 170 of file bsmaster.h.

◆ IDX_BM_IO

#define IDX_BM_IO   (IDX_IO2_o+IDX_IO2_o_SZ)

Definition at line 163 of file bsmaster.h.

◆ IDX_BM_IO_SZ

#define IDX_BM_IO_SZ   5

Definition at line 165 of file bsmaster.h.

◆ IDX_BM_PRD_Table

#define IDX_BM_PRD_Table   (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, PRD_Table )+IDX_BM_IO)

Definition at line 171 of file bsmaster.h.

◆ IDX_BM_Status

Definition at line 169 of file bsmaster.h.

◆ IDX_INDEXED_ADDR

#define IDX_INDEXED_ADDR   (0+IDX_INDEXED_IO)

Definition at line 466 of file bsmaster.h.

◆ IDX_INDEXED_DATA

#define IDX_INDEXED_DATA   (1+IDX_INDEXED_IO)

Definition at line 467 of file bsmaster.h.

◆ IDX_INDEXED_IO

#define IDX_INDEXED_IO   (IDX_SATA_IO+IDX_SATA_IO_SZ)

Definition at line 463 of file bsmaster.h.

◆ IDX_INDEXED_IO_SZ

#define IDX_INDEXED_IO_SZ   2

Definition at line 464 of file bsmaster.h.

◆ IDX_MAX_REG

Definition at line 469 of file bsmaster.h.

◆ IDX_SATA_IO

#define IDX_SATA_IO   (IDX_BM_IO+IDX_BM_IO_SZ)

Definition at line 453 of file bsmaster.h.

◆ IDX_SATA_IO_SZ

#define IDX_SATA_IO_SZ   5

Definition at line 455 of file bsmaster.h.

◆ IDX_SATA_SActive

#define IDX_SATA_SActive   (3+IDX_SATA_IO)

Definition at line 460 of file bsmaster.h.

◆ IDX_SATA_SControl

#define IDX_SATA_SControl   (2+IDX_SATA_IO)

Definition at line 459 of file bsmaster.h.

◆ IDX_SATA_SError

#define IDX_SATA_SError   (1+IDX_SATA_IO)

Definition at line 458 of file bsmaster.h.

◆ IDX_SATA_SNTF_PMN

#define IDX_SATA_SNTF_PMN   (4+IDX_SATA_IO)

Definition at line 461 of file bsmaster.h.

◆ IDX_SATA_SStatus

#define IDX_SATA_SStatus   (0+IDX_SATA_IO)

Definition at line 457 of file bsmaster.h.

◆ IO_FLOPPY_INT

#define IO_FLOPPY_INT   0x3F6 /* AltStatus inside Floppy I/O range */

Definition at line 81 of file bsmaster.h.

◆ IO_WD1

#define IO_WD1   0x1F0 /* Primary Fixed Disk Controller */

Definition at line 78 of file bsmaster.h.

◆ IO_WD2

#define IO_WD2   0x170 /* Secondary Fixed Disk Controller */

Definition at line 79 of file bsmaster.h.

◆ IP_PC98_BANK

#define IP_PC98_BANK   0x432

Definition at line 80 of file bsmaster.h.

◆ IsBusMaster

#define IsBusMaster (   pciData)
Value:
( ((pciData)->Command & (PCI_ENABLE_BUS_MASTER/* | PCI_ENABLE_IO_SPACE*/)) == \
(PCI_ENABLE_BUS_MASTER/* | PCI_ENABLE_IO_SPACE*/))
Definition: shell.h:41
#define PCI_ENABLE_BUS_MASTER
Definition: iotypes.h:3620

Definition at line 853 of file bsmaster.h.

◆ IsMasterDev

#define IsMasterDev (   pciData)
Value:
( ((pciData)->ProgIf & 0x80) && \
#define PCI_IDE_PROGIF_NATIVE_ALL
Definition: bsmaster.h:859

Definition at line 861 of file bsmaster.h.

◆ MAX_RETRIES

#define MAX_RETRIES   6

Definition at line 72 of file bsmaster.h.

◆ MIN_REQ_TTL

#define MIN_REQ_TTL   4

Definition at line 866 of file bsmaster.h.

◆ PCI_ADDRESS_IOMASK

#define PCI_ADDRESS_IOMASK   0xfffffff0

Definition at line 83 of file bsmaster.h.

◆ PCI_DEV_CLASS_STORAGE

#define PCI_DEV_CLASS_STORAGE   0x01

Definition at line 117 of file bsmaster.h.

◆ PCI_DEV_PROGIF_AHCI_1_0

#define PCI_DEV_PROGIF_AHCI_1_0   0x01

Definition at line 124 of file bsmaster.h.

◆ PCI_DEV_SUBCLASS_ATA

#define PCI_DEV_SUBCLASS_ATA   0x05

Definition at line 121 of file bsmaster.h.

◆ PCI_DEV_SUBCLASS_IDE

#define PCI_DEV_SUBCLASS_IDE   0x01

Definition at line 119 of file bsmaster.h.

◆ PCI_DEV_SUBCLASS_RAID

#define PCI_DEV_SUBCLASS_RAID   0x04

Definition at line 120 of file bsmaster.h.

◆ PCI_DEV_SUBCLASS_SATA

#define PCI_DEV_SUBCLASS_SATA   0x06

Definition at line 122 of file bsmaster.h.

◆ PCI_IDE_PROGIF_NATIVE_1

#define PCI_IDE_PROGIF_NATIVE_1   0x01

Definition at line 857 of file bsmaster.h.

◆ PCI_IDE_PROGIF_NATIVE_2

#define PCI_IDE_PROGIF_NATIVE_2   0x04

Definition at line 858 of file bsmaster.h.

◆ PCI_IDE_PROGIF_NATIVE_ALL

#define PCI_IDE_PROGIF_NATIVE_ALL   0x05

Definition at line 859 of file bsmaster.h.

◆ PCIBUSNUM_NOT_SPECIFIED

#define PCIBUSNUM_NOT_SPECIFIED   (0xffffffffL)

Definition at line 1451 of file bsmaster.h.

◆ PCISLOTNUM_NOT_SPECIFIED

#define PCISLOTNUM_NOT_SPECIFIED   (0xffffffffL)

Definition at line 1452 of file bsmaster.h.

◆ REORDER_COST_DENIED

#define REORDER_COST_DENIED   (REORDER_COST_MAX - 3)

Definition at line 982 of file bsmaster.h.

◆ REORDER_COST_INTERSECT

#define REORDER_COST_INTERSECT   (REORDER_COST_MAX - 2)

Definition at line 981 of file bsmaster.h.

◆ REORDER_COST_MAX

#define REORDER_COST_MAX   ((DEF_I64(0x1) << 60) - 1)

Definition at line 979 of file bsmaster.h.

◆ REORDER_COST_RESELECT

#define REORDER_COST_RESELECT   (REORDER_COST_MAX/4)

Definition at line 983 of file bsmaster.h.

◆ REORDER_COST_SWITCH_RW_CD

#define REORDER_COST_SWITCH_RW_CD   (REORDER_COST_MAX/8)

Definition at line 985 of file bsmaster.h.

◆ REORDER_COST_SWITCH_RW_HDD

#define REORDER_COST_SWITCH_RW_HDD   (0)

Definition at line 989 of file bsmaster.h.

◆ REORDER_COST_TTL

#define REORDER_COST_TTL   (REORDER_COST_MAX - 1)

Definition at line 980 of file bsmaster.h.

◆ REORDER_MCOST_SEEK_BACK_CD

#define REORDER_MCOST_SEEK_BACK_CD   (16)

Definition at line 987 of file bsmaster.h.

◆ REORDER_MCOST_SEEK_BACK_HDD

#define REORDER_MCOST_SEEK_BACK_HDD   (2)

Definition at line 991 of file bsmaster.h.

◆ REORDER_MCOST_SWITCH_RW_CD

#define REORDER_MCOST_SWITCH_RW_CD   (0)

Definition at line 986 of file bsmaster.h.

◆ REORDER_MCOST_SWITCH_RW_HDD

#define REORDER_MCOST_SWITCH_RW_HDD   (4)

Definition at line 990 of file bsmaster.h.

◆ REQ_FLAG_DMA_DBUF

#define REQ_FLAG_DMA_DBUF   0x20

Definition at line 938 of file bsmaster.h.

◆ REQ_FLAG_DMA_DBUF_PRD

#define REQ_FLAG_DMA_DBUF_PRD   0x40

Definition at line 939 of file bsmaster.h.

◆ REQ_FLAG_DMA_OPERATION

#define REQ_FLAG_DMA_OPERATION   0x02

Definition at line 932 of file bsmaster.h.

◆ REQ_FLAG_FORCE_DOWNRATE

#define REQ_FLAG_FORCE_DOWNRATE   0x01

Definition at line 931 of file bsmaster.h.

◆ REQ_FLAG_FORCE_DOWNRATE_LBA48

#define REQ_FLAG_FORCE_DOWNRATE_LBA48   0x10

Definition at line 937 of file bsmaster.h.

◆ REQ_FLAG_LBA48

#define REQ_FLAG_LBA48   0x80

Definition at line 940 of file bsmaster.h.

◆ REQ_FLAG_READ

#define REQ_FLAG_READ   0x08

Definition at line 935 of file bsmaster.h.

◆ REQ_FLAG_REORDERABLE_CMD

#define REQ_FLAG_REORDERABLE_CMD   0x04

Definition at line 933 of file bsmaster.h.

◆ REQ_FLAG_RW_MASK

#define REQ_FLAG_RW_MASK   0x08

Definition at line 934 of file bsmaster.h.

◆ REQ_FLAG_WRITE

#define REQ_FLAG_WRITE   0x00

Definition at line 936 of file bsmaster.h.

◆ REQ_STATE_ATAPI_DO_NOTHING_INTR

#define REQ_STATE_ATAPI_DO_NOTHING_INTR   0x44

Definition at line 954 of file bsmaster.h.

◆ REQ_STATE_ATAPI_EXPECTING_CMD_INTR

#define REQ_STATE_ATAPI_EXPECTING_CMD_INTR   0x41

Definition at line 951 of file bsmaster.h.

◆ REQ_STATE_ATAPI_EXPECTING_DATA_INTR

#define REQ_STATE_ATAPI_EXPECTING_DATA_INTR   0x42

Definition at line 952 of file bsmaster.h.

◆ REQ_STATE_ATAPI_EXPECTING_DATA_INTR2

#define REQ_STATE_ATAPI_EXPECTING_DATA_INTR2   0x43

Definition at line 953 of file bsmaster.h.

◆ REQ_STATE_DPC_COMPLETE_REQ

#define REQ_STATE_DPC_COMPLETE_REQ   0x53

Definition at line 962 of file bsmaster.h.

◆ REQ_STATE_DPC_INTR_REQ

#define REQ_STATE_DPC_INTR_REQ   0x51

Definition at line 960 of file bsmaster.h.

◆ REQ_STATE_DPC_RESET_REQ

#define REQ_STATE_DPC_RESET_REQ   0x52

Definition at line 961 of file bsmaster.h.

◆ REQ_STATE_DPC_WAIT_BUSY

#define REQ_STATE_DPC_WAIT_BUSY   0x59

Definition at line 966 of file bsmaster.h.

◆ REQ_STATE_DPC_WAIT_BUSY0

#define REQ_STATE_DPC_WAIT_BUSY0   0x57

Definition at line 964 of file bsmaster.h.

◆ REQ_STATE_DPC_WAIT_BUSY1

#define REQ_STATE_DPC_WAIT_BUSY1   0x58

Definition at line 965 of file bsmaster.h.

◆ REQ_STATE_DPC_WAIT_DRQ

#define REQ_STATE_DPC_WAIT_DRQ   0x5a

Definition at line 967 of file bsmaster.h.

◆ REQ_STATE_DPC_WAIT_DRQ0

#define REQ_STATE_DPC_WAIT_DRQ0   0x5b

Definition at line 968 of file bsmaster.h.

◆ REQ_STATE_DPC_WAIT_DRQ_ERR

#define REQ_STATE_DPC_WAIT_DRQ_ERR   0x5c

Definition at line 969 of file bsmaster.h.

◆ REQ_STATE_EARLY_INTR

#define REQ_STATE_EARLY_INTR   0x48

Definition at line 956 of file bsmaster.h.

◆ REQ_STATE_EXPECTING_INTR

#define REQ_STATE_EXPECTING_INTR   0x40

Definition at line 950 of file bsmaster.h.

◆ REQ_STATE_NONE

#define REQ_STATE_NONE   0x00

Definition at line 943 of file bsmaster.h.

◆ REQ_STATE_PREPARE_TO_NEXT

#define REQ_STATE_PREPARE_TO_NEXT   0x21

Definition at line 947 of file bsmaster.h.

◆ REQ_STATE_PREPARE_TO_TRANSFER

#define REQ_STATE_PREPARE_TO_TRANSFER   0x20

Definition at line 946 of file bsmaster.h.

◆ REQ_STATE_PROCESSING_INTR

#define REQ_STATE_PROCESSING_INTR   0x50

Definition at line 958 of file bsmaster.h.

◆ REQ_STATE_QUEUED

#define REQ_STATE_QUEUED   0x10

Definition at line 944 of file bsmaster.h.

◆ REQ_STATE_READY_TO_TRANSFER

#define REQ_STATE_READY_TO_TRANSFER   0x30

Definition at line 948 of file bsmaster.h.

◆ REQ_STATE_TRANSFER_COMPLETE

#define REQ_STATE_TRANSFER_COMPLETE   0x7f

Definition at line 971 of file bsmaster.h.

◆ RETRY_PIO

#define RETRY_PIO   3

Definition at line 75 of file bsmaster.h.

◆ RETRY_UDMA2

#define RETRY_UDMA2   1

Definition at line 73 of file bsmaster.h.

◆ RETRY_WDMA

#define RETRY_WDMA   2

Definition at line 74 of file bsmaster.h.

◆ SATA_CMD_ICC_Active

#define SATA_CMD_ICC_Active   0x01

Definition at line 602 of file bsmaster.h.

◆ SATA_CMD_ICC_Idle

#define SATA_CMD_ICC_Idle   0x00

Definition at line 600 of file bsmaster.h.

◆ SATA_CMD_ICC_NoOp

#define SATA_CMD_ICC_NoOp   0x00

Definition at line 601 of file bsmaster.h.

◆ SATA_CMD_ICC_Partial

#define SATA_CMD_ICC_Partial   0x02

Definition at line 603 of file bsmaster.h.

◆ SATA_CMD_ICC_Slumber

#define SATA_CMD_ICC_Slumber   0x06

Definition at line 604 of file bsmaster.h.

◆ SATA_MAX_PM_UNITS

#define SATA_MAX_PM_UNITS   16

Definition at line 110 of file bsmaster.h.

◆ SControl_DET_Disable

#define SControl_DET_Disable   0x04

Definition at line 334 of file bsmaster.h.

◆ SControl_DET_DoNothing

#define SControl_DET_DoNothing   0x00

Definition at line 331 of file bsmaster.h.

◆ SControl_DET_Idle

#define SControl_DET_Idle   0x00

Definition at line 332 of file bsmaster.h.

◆ SControl_DET_Init

#define SControl_DET_Init   0x01

Definition at line 333 of file bsmaster.h.

◆ SControl_IPM_NoPartial

#define SControl_IPM_NoPartial   0x01

Definition at line 346 of file bsmaster.h.

◆ SControl_IPM_NoPartialSlumber

#define SControl_IPM_NoPartialSlumber   0x03

Definition at line 348 of file bsmaster.h.

◆ SControl_IPM_NoRestrict

#define SControl_IPM_NoRestrict   0x00

Definition at line 345 of file bsmaster.h.

◆ SControl_IPM_NoSlumber

#define SControl_IPM_NoSlumber   0x02

Definition at line 347 of file bsmaster.h.

◆ SControl_SPD_LimGen1

#define SControl_SPD_LimGen1   0x01

Definition at line 339 of file bsmaster.h.

◆ SControl_SPD_LimGen2

#define SControl_SPD_LimGen2   0x02

Definition at line 340 of file bsmaster.h.

◆ SControl_SPD_LimGen3

#define SControl_SPD_LimGen3   0x03

Definition at line 341 of file bsmaster.h.

◆ SControl_SPD_NoRestrict

#define SControl_SPD_NoRestrict   0x00

Definition at line 338 of file bsmaster.h.

◆ SetPciConfig1

#define SetPciConfig1 (   offs,
  op 
)
Value:
{ \
UCHAR _a = op; \
ScsiPortSetBusDataByOffset(HwDeviceExtension, \
SystemIoBusNumber, \
slotNumber, \
&_a, \
offs, \
1); \
}

Definition at line 1630 of file bsmaster.h.

◆ SetPciConfig2

#define SetPciConfig2 (   offs,
  op 
)
Value:
{ \
USHORT _a = op; \
ScsiPortSetBusDataByOffset(HwDeviceExtension, \
SystemIoBusNumber, \
slotNumber, \
&_a, \
offs, \
2); \
}

Definition at line 1659 of file bsmaster.h.

◆ SetPciConfig4

#define SetPciConfig4 (   offs,
  op 
)
Value:
{ \
ULONG _a = op; \
ScsiPortSetBusDataByOffset(HwDeviceExtension, \
SystemIoBusNumber, \
slotNumber, \
&_a, \
offs, \
4); \
}

Definition at line 1688 of file bsmaster.h.

◆ SStatus_DET_Dev_NoPhy

#define SStatus_DET_Dev_NoPhy   0x01

Definition at line 285 of file bsmaster.h.

◆ SStatus_DET_Dev_Ok

#define SStatus_DET_Dev_Ok   0x03

Definition at line 286 of file bsmaster.h.

◆ SStatus_DET_NoDev

#define SStatus_DET_NoDev   0x00

Definition at line 284 of file bsmaster.h.

◆ SStatus_DET_Offline

#define SStatus_DET_Offline   0x04

Definition at line 287 of file bsmaster.h.

◆ SStatus_IPM_Active

#define SStatus_IPM_Active   0x01

Definition at line 299 of file bsmaster.h.

◆ SStatus_IPM_NoDev

#define SStatus_IPM_NoDev   0x00

Definition at line 298 of file bsmaster.h.

◆ SStatus_IPM_Partial

#define SStatus_IPM_Partial   0x02

Definition at line 300 of file bsmaster.h.

◆ SStatus_IPM_Slumber

#define SStatus_IPM_Slumber   0x06

Definition at line 301 of file bsmaster.h.

◆ SStatus_SPD_Gen1

#define SStatus_SPD_Gen1   0x01

Definition at line 292 of file bsmaster.h.

◆ SStatus_SPD_Gen2

#define SStatus_SPD_Gen2   0x02

Definition at line 293 of file bsmaster.h.

◆ SStatus_SPD_Gen3

#define SStatus_SPD_Gen3   0x03

Definition at line 294 of file bsmaster.h.

◆ SStatus_SPD_NoDev

#define SStatus_SPD_NoDev   0x00

Definition at line 291 of file bsmaster.h.

◆ UNIATA_ALLOCATE_NEW_LUNS

#define UNIATA_ALLOCATE_NEW_LUNS   0x00

Definition at line 1398 of file bsmaster.h.

◆ VM_AUTO

#define VM_AUTO   0x00

Definition at line 1901 of file bsmaster.h.

◆ VM_BOCHS

#define VM_BOCHS   0x05

Definition at line 1906 of file bsmaster.h.

◆ VM_MAX_KNOWN

#define VM_MAX_KNOWN   VM_PCEM

Definition at line 1909 of file bsmaster.h.

◆ VM_NONE

#define VM_NONE   0x01

Definition at line 1902 of file bsmaster.h.

◆ VM_PCEM

#define VM_PCEM   0x06

Definition at line 1907 of file bsmaster.h.

◆ VM_QEMU

#define VM_QEMU   0x04

Definition at line 1905 of file bsmaster.h.

◆ VM_VBOX

#define VM_VBOX   0x02

Definition at line 1903 of file bsmaster.h.

◆ VM_VMWARE

#define VM_VMWARE   0x03

Definition at line 1904 of file bsmaster.h.

Typedef Documentation

◆ AHCI_ATA_H2D_FIS

◆ AHCI_IS_REG

typedef union _AHCI_IS_REG AHCI_IS_REG

◆ ATA_REQ

typedef union _ATA_REQ ATA_REQ

◆ BM_DMA_ENTRY

◆ BUSMASTER_CTX

◆ HW_CHANNEL

◆ HW_DEVICE_EXTENSION

◆ HW_LU_EXTENSION

◆ IDE_AHCI_CHANNEL_CTL_BLOCK

◆ IDE_AHCI_CMD

◆ IDE_AHCI_CMD_LIST

◆ IDE_AHCI_PORT_REGISTERS

◆ IDE_AHCI_PRD_ENTRY

◆ IDE_AHCI_RCV_FIS

◆ IDE_AHCI_REGISTERS

◆ IDE_BUSMASTER_REGISTERS

◆ IDE_SATA_REGISTERS

◆ IORES

typedef struct _IORES IORES

◆ ISR2_DEVICE_EXTENSION

◆ PAHCI_ATA_H2D_FIS

◆ PAHCI_IS_REG

typedef union _AHCI_IS_REG * PAHCI_IS_REG

◆ PATA_REQ

typedef union _ATA_REQ * PATA_REQ

◆ PBM_DMA_ENTRY

◆ PBUSMASTER_CTX

◆ PCIIDE_DEVICE_EXTENSION

Definition at line 1355 of file bsmaster.h.

◆ PHW_CHANNEL

◆ PHW_DEVICE_EXTENSION

◆ PHW_LU_EXTENSION

◆ PIDE_AHCI_CHANNEL_CTL_BLOCK

◆ PIDE_AHCI_CMD

◆ PIDE_AHCI_CMD_LIST

◆ PIDE_AHCI_PORT_REGISTERS

◆ PIDE_AHCI_PRD_ENTRY

◆ PIDE_AHCI_RCV_FIS

◆ PIDE_AHCI_REGISTERS

◆ PIDE_BUSMASTER_REGISTERS

◆ PIDE_SATA_REGISTERS

◆ PIORES

typedef struct _IORES * PIORES

◆ PISR2_DEVICE_EXTENSION

◆ PPCIIDE_DEVICE_EXTENSION

Definition at line 1356 of file bsmaster.h.

◆ PSATA_SCONTROL_REG

◆ PSATA_SERROR_REG

◆ PSATA_SSTATUS_REG

◆ SATA_SCONTROL_REG

◆ SATA_SERROR_REG

◆ SATA_SSTATUS_REG

Function Documentation

◆ AtapiChipInit()

BOOLEAN NTAPI AtapiChipInit ( IN PVOID  HwDeviceExtension,
IN ULONG  DeviceNumber,
IN ULONG  c 
)

Definition at line 1886 of file id_init.cpp.

1891{
1892 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
1893 ULONG slotNumber = deviceExtension->slotNumber;
1894 ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber;
1895 ULONG VendorID = deviceExtension->DevID & 0xffff;
1896 ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
1897 ULONG RevID = deviceExtension->RevID;
1898// ULONG i;
1899// BUSMASTER_CONTROLLER_INFORMATION_BASE* DevTypeInfo;
1900 ULONG ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK;
1901 ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
1902 PHW_CHANNEL chan;
1903 UCHAR tmp8;
1904 USHORT tmp16;
1905 ULONG tmp32;
1906 ULONG c; // logical channel (for Compatible Mode controllers)
1907 BOOLEAN CheckCable = FALSE;
1909 //ULONG BaseIoAddress;
1910
1911 switch(channel) {
1913 CheckCable = TRUE;
1914 /* FALLTHROUGH */
1915 case CHAN_NOT_SPECIFIED:
1917 GlobalInit = TRUE;
1918 break;
1919 default:
1920 //c = channel - deviceExtension->Channel; // logical channel (for Compatible Mode controllers)
1921 c = channel;
1922 channel += deviceExtension->Channel;
1923 }
1924
1925 KdPrint2((PRINT_PREFIX "AtapiChipInit: dev %#x, ph chan %d, c %d\n", DeviceNumber, channel, c));
1926
1927 KdPrint2((PRINT_PREFIX "HwFlags: %#x\n", deviceExtension->HwFlags));
1928 KdPrint2((PRINT_PREFIX "VendorID/DeviceID/Rev %#x/%#x/%#x\n", VendorID, DeviceID, RevID));
1929
1930 if(deviceExtension->UnknownDev) {
1931 KdPrint2((PRINT_PREFIX " Unknown chip\n" ));
1932 //return TRUE;
1933 VendorID = 0xffffffff;
1934 }
1935
1936
1937 if(ChipFlags & UNIATA_AHCI) {
1938 /* if BAR(5) is IO it should point to SATA interface registers */
1939 if(!deviceExtension->BaseIoAHCI_0.Addr) {
1940 KdPrint2((PRINT_PREFIX " !BaseIoAHCI_0, exiting\n" ));
1941 return FALSE;
1942 }
1943 if(c == CHAN_NOT_SPECIFIED) {
1944 return UniataAhciInit(HwDeviceExtension);
1945 } else
1946 if(c<deviceExtension->NumberChannels) {
1947 KdPrint2((PRINT_PREFIX " AHCI single channel init\n" ));
1948 UniataAhciReset(HwDeviceExtension, c);
1949 return TRUE;
1950 } else {
1951 KdPrint2((PRINT_PREFIX " AHCI non-existent channel\n" ));
1952 return FALSE;
1953 }
1954 }
1955
1956 if((WinVer_Id() > WinVer_NT) &&
1957 GlobalInit &&
1958 deviceExtension->MasterDev) {
1959 PCI_COMMON_CONFIG pciData;
1960 ULONG busDataRead;
1961
1962 KdPrint2((PRINT_PREFIX " re-enable IO resources of MasterDev\n" ));
1963
1964 busDataRead = HalGetBusData
1965 //ScsiPortGetBusData
1966 (
1967 //HwDeviceExtension,
1968 PCIConfiguration, SystemIoBusNumber, slotNumber,
1969 &pciData, PCI_COMMON_HDR_LENGTH);
1970 if(busDataRead == PCI_COMMON_HDR_LENGTH) {
1971 UniataEnableIoPCI(SystemIoBusNumber, slotNumber, &pciData);
1972 } else {
1973 KdPrint2((PRINT_PREFIX " re-enable IO resources of MasterDev FAILED\n" ));
1974 }
1975 }
1976
1977 switch(VendorID) {
1978// case ATA_ACARD_ID:
1979// break;
1980 case ATA_ACER_LABS_ID:
1981 if(ChipFlags & UNIATA_SATA) {
1982 if(c == CHAN_NOT_SPECIFIED) {
1983 for(c=0; c<deviceExtension->NumberChannels; c++) {
1984 chan = &deviceExtension->chan[c];
1986 /* the southbridge might need the data corruption fix */
1987 if(RevID == 0xc2 || RevID == 0xc3) {
1988 AtapiAliSouthBridgeFixup(HwDeviceExtension, PCIConfiguration,
1989 SystemIoBusNumber, slotNumber, c);
1990 }
1991 }
1992 /* enable PCI interrupt */
1994 }
1995 } else
1996 if(ChipFlags & ALINEW) {
1997 if(c == CHAN_NOT_SPECIFIED) {
1998 /* use device interrupt as byte count end */
1999 ChangePciConfig1(0x4a, (a | 0x20));
2000 /* enable cable detection and UDMA support on newer chips, rev < 0xc7 */
2001 if(RevID < 0xc7) {
2002 ChangePciConfig1(0x4b, (a | 0x09));
2003 }
2004
2005 /* enable ATAPI UDMA mode */
2006 ChangePciConfig1(0x53, (a | (RevID >= 0xc7 ? 0x03 : 0x01)));
2007
2008 } else {
2009 // check 80-pin cable
2010 generic_cable80(deviceExtension, channel, 0x4a, 0);
2011 }
2012 } else {
2013 if(c == CHAN_NOT_SPECIFIED) {
2014 /* deactivate the ATAPI FIFO and enable ATAPI UDMA */
2015 ChangePciConfig1(0x53, (a | 0x03));
2016 } else {
2017 // ATAPI DMA R/O
2018 deviceExtension->chan[c].ChannelCtrlFlags |= CTRFLAGS_DMA_RO;
2019 }
2020 }
2021 break;
2022 case ATA_AMD_ID:
2023 if(c == CHAN_NOT_SPECIFIED) {
2024 /* set prefetch, postwrite */
2025 if(ChipFlags & AMDBUG) {
2026 ChangePciConfig1(0x41, (a & 0x0f));
2027 } else {
2028 ChangePciConfig1(0x41, (a | 0xf0));
2029 }
2030 }
2031 if(deviceExtension->MaxTransferMode < ATA_UDMA2)
2032 break;
2033 // check 80-pin cable
2034 if(!(ChipFlags & UNIATA_NO80CHK)) {
2035 if(c == CHAN_NOT_SPECIFIED) {
2036 // do nothing
2037 } else {
2038 generic_cable80(deviceExtension, channel, 0x42, 0);
2039 }
2040 }
2041 break;
2042 case ATA_HIGHPOINT_ID:
2043
2044 if(c == CHAN_NOT_SPECIFIED) {
2045
2046 if(ChipFlags & HPTOLD) {
2047 /* turn off interrupt prediction */
2048 ChangePciConfig1(0x51, (a & ~0x80));
2049 } else {
2050 /* turn off interrupt prediction */
2051 ChangePciConfig1(0x51, (a & ~0x03));
2052 ChangePciConfig1(0x55, (a & ~0x03));
2053 /* turn on interrupts */
2054 ChangePciConfig1(0x5a, (a & ~0x10));
2055 /* set clocks etc */
2056 if(ChipType < HPT372) {
2057 SetPciConfig1(0x5b, 0x22);
2058 } else {
2059 ChangePciConfig1(0x5b, ((a & 0x01) | 0x20));
2060 }
2061 }
2062
2063 } else {
2064 // check 80-pin cable
2065 chan = &deviceExtension->chan[c];
2066 if(!hpt_cable80(deviceExtension, channel)) {
2067 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2068 }
2069 }
2070 break;
2071 case ATA_INTEL_ID: {
2072 BOOLEAN IsPata;
2073 USHORT reg54;
2074 if(ChipFlags & UNIATA_SATA) {
2075
2076 KdPrint2((PRINT_PREFIX "Intel SATA\n"));
2077 if(ChipFlags & UNIATA_AHCI) {
2078 KdPrint2((PRINT_PREFIX "Do nothing for AHCI\n"));
2079 /* enable PCI interrupt */
2081 break;
2082 }
2083 if(c == CHAN_NOT_SPECIFIED) {
2084 KdPrint2((PRINT_PREFIX "Base init\n"));
2085 /* force all ports active "the legacy way" */
2086 ChangePciConfig2(0x92, (a | 0x0f));
2087
2088 if(deviceExtension->BaseIoAddressSATA_0.Addr && (ChipFlags & ICH7)) {
2089 /* Set SCRAE bit to enable registers access. */
2090 ChangePciConfig4(0x94, (a | (1 << 9)));
2091 /* Set Ports Implemented register bits. */
2092 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x0c,
2093 AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x0c) | 0x0f);
2094 }
2095 /* enable PCI interrupt */
2097
2098 } else {
2099
2100 KdPrint2((PRINT_PREFIX "channel init\n"));
2101
2102 GetPciConfig1(0x90, tmp8);
2103 KdPrint2((PRINT_PREFIX "reg 90: %x, init lun map\n", tmp8));
2104
2105 KdPrint2((PRINT_PREFIX "chan %d\n", c));
2106 chan = &deviceExtension->chan[c];
2107 IsPata = FALSE;
2108 if(ChipFlags & ICH5) {
2109 KdPrint2((PRINT_PREFIX "ICH5\n"));
2110 if ((tmp8 & 0x04) == 0) {
2112 chan->lun[0]->SATA_lun_map = (tmp8 & 0x01) ^ c;
2113 chan->lun[1]->SATA_lun_map = 0;
2114 } else if ((tmp8 & 0x02) == 0) {
2115 if(c == 0) {
2116 chan->lun[0]->SATA_lun_map = (tmp8 & 0x01) ? 1 : 0;
2117 chan->lun[1]->SATA_lun_map = (tmp8 & 0x01) ? 0 : 1;
2118 } else {
2119 IsPata = TRUE;
2120 //chan->ChannelCtrlFlags |= CTRFLAGS_PATA;
2121 }
2122 } else if ((tmp8 & 0x02) != 0) {
2123 if(c == 1) {
2124 chan->lun[0]->SATA_lun_map = (tmp8 & 0x01) ? 1 : 0;
2125 chan->lun[1]->SATA_lun_map = (tmp8 & 0x01) ? 0 : 1;
2126 } else {
2127 IsPata = TRUE;
2128 //chan->ChannelCtrlFlags |= CTRFLAGS_PATA;
2129 }
2130 }
2131 } else
2132 if(ChipFlags & I6CH2) {
2133 KdPrint2((PRINT_PREFIX "I6CH2\n"));
2135 chan->lun[0]->SATA_lun_map = c ? 0 : 1;
2136 chan->lun[1]->SATA_lun_map = 0;
2137 } else {
2138 KdPrint2((PRINT_PREFIX "other Intel\n"));
2139 switch(tmp8 & 0x03) {
2140 case 0:
2141 KdPrint2((PRINT_PREFIX "0 -> %d/%d\n", 0+c, 2+c));
2142 chan->lun[0]->SATA_lun_map = 0+c;
2143 chan->lun[1]->SATA_lun_map = 2+c;
2144 break;
2145 case 2:
2146 if(c==0) {
2147 KdPrint2((PRINT_PREFIX "2 -> %d/%d\n", 0, 2));
2148 chan->lun[0]->SATA_lun_map = 0;
2149 chan->lun[1]->SATA_lun_map = 2;
2150 } else {
2151 // PATA
2152 KdPrint2((PRINT_PREFIX "PATA\n"));
2153 IsPata = TRUE;
2154 }
2155 break;
2156 case 1:
2157 if(c==1) {
2158 KdPrint2((PRINT_PREFIX "2 -> %d/%d\n", 1, 3));
2159 chan->lun[0]->SATA_lun_map = 1;
2160 chan->lun[1]->SATA_lun_map = 3;
2161 } else {
2162 // PATA
2163 KdPrint2((PRINT_PREFIX "PATA\n"));
2164 IsPata = TRUE;
2165 }
2166 break;
2167 }
2168 }
2169
2170 if(IsPata) {
2171 KdPrint2((PRINT_PREFIX "PATA part\n"));
2172 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA5);
2173 }
2174
2175 if(ChipType == INTEL_IDX) {
2176 KdPrint2((PRINT_PREFIX "io indexed\n"));
2177 //for(c=0; c<deviceExtension->NumberChannels; c++) {
2178 chan = &deviceExtension->chan[c];
2179 UniataSataWritePort4(chan, IDX_SATA_SError, 0xffffffff, 0);
2180 if(!(chan->ChannelCtrlFlags & CTRFLAGS_NO_SLAVE)) {
2181 UniataSataWritePort4(chan, IDX_SATA_SError, 0xffffffff, 1);
2182 }
2183 //}
2184 }
2185 }
2186
2187 break;
2188 }
2189 if(deviceExtension->MaxTransferMode <= ATA_UDMA2)
2190 break;
2191 // check 80-pin cable
2192 if(c == CHAN_NOT_SPECIFIED) {
2193 // do nothing
2194 } else {
2195 chan = &deviceExtension->chan[c];
2196 GetPciConfig2(0x54, reg54);
2197 KdPrint2((PRINT_PREFIX " intel 80-pin check (reg54=%x)\n", reg54));
2198 if(deviceExtension->HwFlags & UNIATA_NO80CHK) {
2199 KdPrint2((PRINT_PREFIX " No check (administrative)\n"));
2200 if(chan->Force80pin) {
2201 KdPrint2((PRINT_PREFIX "Force80pin\n"));
2202 }
2203 } else
2204 if(reg54 == 0x0000 || reg54 == 0xffff) {
2205 KdPrint2((PRINT_PREFIX " check failed (not supported)\n"));
2206 } else
2207 if( ((reg54 >> (channel*2)) & 30) == 0) {
2208 KdPrint2((PRINT_PREFIX " intel 40-pin\n"));
2209 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2210 }
2211 }
2212 break; }
2213 case ATA_NVIDIA_ID: {
2214 if(ChipFlags & UNIATA_SATA) {
2215 if(c == CHAN_NOT_SPECIFIED) {
2216 ULONG offs = (ChipFlags & NV4OFF) ? 0x0440 : 0x0010;
2217 /* enable control access */
2218 ChangePciConfig1(0x50, (a | 0x04));
2219 /* MCP55 seems to need some time to allow r_res2 read. */
2221 KdPrint2((PRINT_PREFIX "BaseIoAddressSATA_0=%x\n", deviceExtension->BaseIoAddressSATA_0.Addr));
2222 if(ChipFlags & NVQ) {
2223 KdPrint2((PRINT_PREFIX "Disable NCQ\n"));
2224 tmp32 = AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x0400);
2225 KdPrint2((PRINT_PREFIX "MODE=%#x\n", tmp32));
2226 if(tmp32 & ~0xfffffff9) {
2227 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x0400,
2228 tmp32 & 0xfffffff9);
2229 }
2230 ChipFlags &= ~NVQ;
2231 deviceExtension->HwFlags = ChipFlags;
2232 }
2233 if(ChipFlags & NVQ) {
2234 /* disable ECO 398 */
2235 ChangePciConfig1(0x7f, (a & ~(1 << 7)));
2236
2237 KdPrint2((PRINT_PREFIX "Enable NCQ\n"));
2238 /* enable NCQ support */
2239 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x0400,
2240 tmp32 | ~0x00000006);
2241
2242 /* clear interrupt status */
2243 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),offs, 0x00ff00ff);
2244 /* enable device and PHY state change interrupts */
2245 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),offs+4, 0x000d000d);
2246 } else {
2247 /* clear interrupt status */
2248 AtapiWritePortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),offs, 0xff);
2249 /* enable device and PHY state change interrupts */
2250 AtapiWritePortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),offs+1, 0xdd);
2251 }
2252 /* enable PCI interrupt */
2254 } else {
2255 //UniataSataPhyEnable(HwDeviceExtension, c);
2256 }
2257 } else {
2258 //UCHAR reg52;
2259
2260 if(c == CHAN_NOT_SPECIFIED) {
2261 /* set prefetch, postwrite */
2262 ChangePciConfig1(0x51, (a & 0x0f));
2263 } else {
2264 // check 80-pin cable
2265 generic_cable80(deviceExtension, channel, 0x52, 1);
2266/* chan = &deviceExtension->chan[c];
2267 GetPciConfig1(0x52, reg52);
2268 if( !((reg52 >> (channel*2)) & 0x01)) {
2269 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2270 }*/
2271 }
2272 }
2273 break; }
2274 case ATA_PROMISE_ID: {
2275 USHORT Reg50;
2276 switch(ChipType) {
2277 case PRNEW:
2278 /* setup clocks */
2279 if(c == CHAN_NOT_SPECIFIED) {
2280// ATA_OUTB(ctlr->r_res1, 0x11, ATA_INB(ctlr->r_res1, 0x11) | 0x0a);
2281 AtapiWritePortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11,
2282 AtapiReadPortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11) | 0x0a );
2283 }
2284 /* FALLTHROUGH */
2285 case PROLD:
2286 /* enable burst mode */
2287// ATA_OUTB(ctlr->r_res1, 0x1f, ATA_INB(ctlr->r_res1, 0x1f) | 0x01);
2288 if(c == CHAN_NOT_SPECIFIED) {
2289 AtapiWritePortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x1f,
2290 AtapiReadPortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x1f) | 0x01 );
2291 } else {
2292 // check 80-pin cable
2293 chan = &deviceExtension->chan[c];
2294 GetPciConfig2(0x50, Reg50);
2295 if(Reg50 & (1 << (channel+10))) {
2296 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2297 }
2298 }
2299 break;
2300 case PRTX:
2301 if(c == CHAN_NOT_SPECIFIED) {
2302 // do nothing
2303 } else {
2304 // check 80-pin cable
2305 chan = &deviceExtension->chan[c];
2307 if(AtapiReadPort1(chan, IDX_BM_DeviceSpecific1) & 0x04) {
2308 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2309 }
2310 }
2311 break;
2312 case PRMIO:
2313 if(c == CHAN_NOT_SPECIFIED) {
2314 /* clear SATA status and unmask interrupts */
2316 (ChipFlags & PRG2) ? 0x60 : 0x6c, 0x000000ff);
2317 if(ChipFlags & UNIATA_SATA) {
2318 /* enable "long burst length" on gen2 chips */
2319 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0), 0x44,
2320 AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0), 0x44) | 0x2000);
2321 }
2322 } else {
2323 chan = &deviceExtension->chan[c];
2325 (AtapiReadPort4(chan, IDX_BM_Command) & ~0x00000f8f) | channel );
2326 AtapiWritePort4(chan, IDX_BM_DeviceSpecific0, 0x00000001);
2327 // check 80-pin cable
2328 if(chan->MaxTransferMode < ATA_SA150 &&
2329 (AtapiReadPort4(chan, IDX_BM_Command) & 0x01000000)) {
2330 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2331 }
2332 }
2333 break;
2334 }
2335 break; }
2336 case ATA_SERVERWORKS_ID:
2337 if(c == CHAN_NOT_SPECIFIED) {
2338 if(ChipType == SWKS33) {
2340 SystemIoBusNumber, slotNumber);
2341 } else {
2342 ChangePciConfig1(0x5a, ((a & ~0x40) | ((ChipType == SWKS100) ? 0x03 : 0x02)));
2343 }
2344 }
2345 break;
2346 case ATA_ATI_ID:
2347 if(ChipType == SIIMIO) {
2348 KdPrint2((PRINT_PREFIX "ATI New\n"));
2349 // fall to SiI
2350 } else {
2351 KdPrint2((PRINT_PREFIX "ATI\n"));
2352 break;
2353 }
2354 /* FALLTHROUGH */
2356 /* if(ChipFlags & SIIENINTR) {
2357 SetPciConfig1(0x71, 0x01);
2358 }*/
2359 switch(ChipType) {
2360 case SIIMIO: {
2361
2362 KdPrint2((PRINT_PREFIX "SII\n"));
2363 USHORT Reg79;
2364
2365 if(c == CHAN_NOT_SPECIFIED) {
2366 if(ChipFlags & SIISETCLK) {
2367 KdPrint2((PRINT_PREFIX "SIISETCLK\n"));
2368 GetPciConfig1(0x8a, tmp8);
2369 if ((tmp8 & 0x30) != 0x10)
2370 ChangePciConfig1(0x8a, (a & 0xcf) | 0x10);
2371 GetPciConfig1(0x8a, tmp8);
2372 if ((tmp8 & 0x30) != 0x10) {
2373 KdPrint2((PRINT_PREFIX "Sil 0680 could not set ATA133 clock\n"));
2374 deviceExtension->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA5);
2375 }
2376 }
2377 }
2378 if(deviceExtension->MaxTransferMode < ATA_SA150) {
2379 // check 80-pin cable
2380 if(c == CHAN_NOT_SPECIFIED) {
2381 // do nothing
2382 } else {
2383 KdPrint2((PRINT_PREFIX "Check UDMA66 cable\n"));
2384 chan = &deviceExtension->chan[c];
2385 GetPciConfig2(0x79, Reg79);
2386 if(Reg79 & (channel ? 0x02 : 0x01)) {
2387 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2388 }
2389 }
2390 } else {
2391 ULONG unit01 = (c & 1);
2392 ULONG unit10 = (c & 2);
2393 /* enable/disable PHY state change interrupt */
2394 if(c == CHAN_NOT_SPECIFIED) {
2395 for(c=0; c<deviceExtension->NumberChannels; c++) {
2396 unit01 = (c & 1);
2397 unit10 = (c & 2);
2398 if(ChipFlags & SIINOSATAIRQ) {
2399 KdPrint2((PRINT_PREFIX "Disable broken SATA intr on c=%x\n", c));
2400 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x148 + (unit01 << 7) + (unit10 << 8),0);
2401 }
2402 }
2403 } else {
2404 if(ChipFlags & SIINOSATAIRQ) {
2405 KdPrint2((PRINT_PREFIX "Disable broken SATA intr on c=%x\n", c));
2406 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x148 + (unit01 << 7) + (unit10 << 8),0);
2407 } else {
2408 KdPrint2((PRINT_PREFIX "Enable SATA intr on c=%x\n", c));
2409 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x148 + (unit01 << 7) + (unit10 << 8),(1 << 16));
2410 }
2411 }
2412 }
2413 if(c == CHAN_NOT_SPECIFIED) {
2414 /* enable interrupt as BIOS might not */
2415 ChangePciConfig1(0x8a, (a & 0x3f));
2416 // Enable 3rd and 4th channels
2417 if (ChipFlags & SII4CH) {
2418 KdPrint2((PRINT_PREFIX "SII4CH\n"));
2419 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x0200, 0x00000002);
2420 }
2421 } else {
2422 chan = &deviceExtension->chan[c];
2423 /* dont block interrupts */
2424 //ChangePciConfig4(0x48, (a & ~0x03c00000));
2425 /*tmp32 =*/ AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x48);
2426 AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x48, (1 << 22) << c);
2427 // flush
2428 /*tmp32 =*/ AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x48);
2429
2430 /* Initialize FIFO PCI bus arbitration */
2431 GetPciConfig1(offsetof(PCI_COMMON_CONFIG, CacheLineSize), tmp8);
2432 if(tmp8) {
2433 KdPrint2((PRINT_PREFIX "SII: CacheLine=%d\n", tmp8));
2434 tmp8 = (tmp8/8)+1;
2435 AtapiWritePort2(chan, IDX_BM_DeviceSpecific1, ((USHORT)tmp8) << 8 | tmp8);
2436 } else {
2437 KdPrint2((PRINT_PREFIX "SII: CacheLine=0 !!!\n"));
2438 }
2439 }
2440 break; }
2441
2442 case SIICMD: {
2443
2444 KdPrint2((PRINT_PREFIX "SII_CMD\n"));
2445 if(c == CHAN_NOT_SPECIFIED) {
2446 /* Setup interrupts. */
2447 SetPciConfig1(0x71, 0x01);
2448
2449 /* GetPciConfig1(0x8a, tmp8);
2450 tmp8 &= ~(0x30);
2451 SetPciConfig1(0x71, tmp8);*/
2452
2453 /* Use MEMORY READ LINE for reads.
2454 * NOTE: Although not mentioned in the PCI0646U specs,
2455 * these bits are write only and won't be read
2456 * back as set or not. The PCI0646U2 specs clarify
2457 * this point.
2458 */
2459 /* tmp8 |= 0x02;
2460 SetPciConfig1(0x71, tmp8);
2461 */
2462 /* Set reasonable active/recovery/address-setup values. */
2463 SetPciConfig1(0x53, 0x40);
2464 SetPciConfig1(0x54, 0x3f);
2465 SetPciConfig1(0x55, 0x40);
2466 SetPciConfig1(0x56, 0x3f);
2467 SetPciConfig1(0x57, 0x1c);
2468 SetPciConfig1(0x58, 0x3f);
2469 SetPciConfig1(0x5b, 0x3f);
2470 }
2471
2472 break; }
2473 case ATI700:
2474 KdPrint2((PRINT_PREFIX "ATI700\n"));
2475 if(c == 0 && !(ChipFlags & UNIATA_AHCI)) {
2476 KdPrint2((PRINT_PREFIX "IXP700 PATA\n"));
2477 chan = &deviceExtension->chan[c];
2478 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA5);
2479 }
2480 break;
2481 } /* switch(ChipType) */
2482 break;
2483 case ATA_SIS_ID:
2484 if(c == CHAN_NOT_SPECIFIED) {
2485 switch(ChipType) {
2486 case SIS33:
2487 break;
2488 case SIS66:
2489 case SIS100OLD:
2490 ChangePciConfig1(0x52, (a & ~0x04));
2491 break;
2492 case SIS100NEW:
2493 case SIS133OLD:
2494 ChangePciConfig1(0x49, (a & ~0x01));
2495 break;
2496 case SIS133NEW:
2497 ChangePciConfig2(0x50, (a | 0x0008));
2498 ChangePciConfig2(0x52, (a | 0x0008));
2499 break;
2500 case SISSATA:
2501 ChangePciConfig2(0x04, (a & ~0x0400));
2502 break;
2503 }
2504 }
2505 if(deviceExtension->HwFlags & UNIATA_SATA) {
2506 // do nothing for SATA
2507 } else
2508 if(ChipType == SIS133NEW) {
2509 // check 80-pin cable
2510 if(c == CHAN_NOT_SPECIFIED) {
2511 // do nothing
2512 } else {
2513 chan = &deviceExtension->chan[c];
2514 GetPciConfig2(channel ? 0x52 : 0x50, tmp16);
2515 if(tmp16 & 0x8000) {
2516 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2517 }
2518 }
2519 } else {
2520 // check 80-pin cable
2521 if(c == CHAN_NOT_SPECIFIED) {
2522 // do nothing
2523 } else {
2524 chan = &deviceExtension->chan[c];
2525 GetPciConfig1(48, tmp8);
2526 if(tmp8 & (0x10 << channel)) {
2527 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2528 }
2529 }
2530 }
2531 break;
2532 case ATA_VIA_ID:
2533
2534/* if(ChipFlags & (UNIATA_SATA | UNIATA_AHCI | VIASATA) {
2535 break;
2536 }*/
2537 if(c == CHAN_NOT_SPECIFIED) {
2538 /* prepare for ATA-66 on the 82C686a and 82C596b */
2539 if(ChipFlags & VIACLK) {
2540 ChangePciConfig4(0x50, (a | 0x030b030b));
2541 }
2542 // no init for SATA
2543 if(ChipFlags & (UNIATA_SATA | VIASATA)) {
2544 /* enable PCI interrupt */
2546
2547 /*
2548 * vt6420/1 has problems talking to some drives. The following
2549 * is based on the fix from Joseph Chan <JosephChan@via.com.tw>.
2550 *
2551 * When host issues HOLD, device may send up to 20DW of data
2552 * before acknowledging it with HOLDA and the host should be
2553 * able to buffer them in FIFO. Unfortunately, some WD drives
2554 * send upto 40DW before acknowledging HOLD and, in the
2555 * default configuration, this ends up overflowing vt6421's
2556 * FIFO, making the controller abort the transaction with
2557 * R_ERR.
2558 *
2559 * Rx52[2] is the internal 128DW FIFO Flow control watermark
2560 * adjusting mechanism enable bit and the default value 0
2561 * means host will issue HOLD to device when the left FIFO
2562 * size goes below 32DW. Setting it to 1 makes the watermark
2563 * 64DW.
2564 *
2565 * http://www.reactos.org/bugzilla/show_bug.cgi?id=6500
2566 */
2567#ifdef __REACTOS__
2568 // New URL is https://jira.reactos.org/browse/CORE-5897
2569#endif
2570
2571 if(DeviceID == 0x3149 || DeviceID == 0x3249) { //vt6420 or vt6421
2572 KdPrint2((PRINT_PREFIX "VIA 642x FIFO\n"));
2573 ChangePciConfig1(0x52, a | (1 << 2));
2574 }
2575
2576 break;
2577 }
2578
2579 /* the southbridge might need the data corruption fix */
2580 if(ChipFlags & VIABUG) {
2581 AtapiViaSouthBridgeFixup(HwDeviceExtension, PCIConfiguration,
2582 SystemIoBusNumber, slotNumber);
2583 }
2584 /* set prefetch, postwrite */
2585 if(ChipType != VIA133) {
2586 ChangePciConfig1(0x41, (a | 0xf0));
2587 }
2588
2589 /* set fifo configuration half'n'half */
2590 ChangePciConfig1(0x43, ((a & ((ChipFlags & VIAPRQ) ? 0x80 : 0x90)) | 0x2a));
2591
2592 /* set status register read retry */
2593 ChangePciConfig1(0x44, (a | 0x08));
2594
2595 /* set DMA read & end-of-sector fifo flush */
2596 ChangePciConfig1(0x46, ((a & 0x0c) | 0xf0));
2597
2598 /* set sector size */
2599 SetPciConfig2(0x60, DEV_BSIZE);
2600 SetPciConfig2(0x68, DEV_BSIZE);
2601 } else {
2602
2603 chan = &deviceExtension->chan[c];
2604 // no init for SATA
2605 if(ChipFlags & (UNIATA_SATA | VIASATA)) {
2606 if((ChipFlags & VIABAR) && (c >= 2)) {
2607 // this is PATA channel
2608 chan->MaxTransferMode = ATA_UDMA5;
2609 break;
2610 }
2611 UniataSataWritePort4(chan, IDX_SATA_SError, 0xffffffff, 0);
2612 break;
2613 }
2614/*
2615 // check 80-pin cable
2616 if(!via_cable80(deviceExtension, channel)) {
2617 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2618 }
2619*/
2620 }
2621
2622 break;
2623
2624 case ATA_ITE_ID:
2625 if(ChipType == ITE_33 || ChipType == ITE_133_NEW) {
2626 break;
2627 }
2628 if(ChipType == ITE_133) {
2629 if(c == CHAN_NOT_SPECIFIED) {
2630 /* set PCI mode and 66Mhz reference clock */
2631 ChangePciConfig1(0x50, a & ~0x83);
2632
2633 /* set default active & recover timings */
2634 SetPciConfig1(0x54, 0x31);
2635 SetPciConfig1(0x56, 0x31);
2636 } else {
2637 // check 80-pin cable
2638 GetPciConfig2(0x40, tmp16);
2639 chan = &deviceExtension->chan[c];
2640 if(!(tmp16 & (channel ? 0x08 : 0x04))) {
2641 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2642 }
2643 }
2644 } else
2645 if(ChipType == ITE_133_NEW) {
2646 }
2647 break;
2648 case ATA_CYRIX_ID:
2649 KdPrint2((PRINT_PREFIX "Cyrix\n"));
2650 if(ChipType == CYRIX_OLD) {
2651 if(c == CHAN_NOT_SPECIFIED) {
2652 GetPciConfig1(0x60, tmp8);
2653 if(!(tmp8 & 0x40)) {
2654 KdPrint2((PRINT_PREFIX "Enable DMA\n"));
2655 tmp8 |= 0x40;
2656 SetPciConfig1(0x60, tmp8);
2657 }
2658 }
2659 }
2660 break;
2661 case ATA_JMICRON_ID:
2662 /* New JMicron PATA controllers */
2663 if(deviceExtension->DevID == ATA_JMB361 ||
2664 deviceExtension->DevID == ATA_JMB363 ||
2665 deviceExtension->DevID == ATA_JMB365 ||
2666 deviceExtension->DevID == ATA_JMB366 ||
2667 deviceExtension->DevID == ATA_JMB368) {
2668 KdPrint2((PRINT_PREFIX "JMicron\n"));
2669
2670 ULONG c_swp = 0;
2671 ULONG reg40, reg80;
2672
2673 GetPciConfig4(0x40, reg40);
2674 KdPrint2((PRINT_PREFIX "reg 40: %x\n", reg40));
2675
2676 c_swp = (reg40 & (1<<22)) ? 1 : 0; // 1=swap, 0=keep
2677 KdPrint2((PRINT_PREFIX "c_swp: %x\n", c_swp));
2678
2679 GetPciConfig4(0x80, reg80);
2680 KdPrint2((PRINT_PREFIX "reg 80: %x\n", reg80));
2681
2682 if(c == CHAN_NOT_SPECIFIED) {
2683 UCHAR P1mode;
2684
2685 P1mode = (reg80 & (1<<24)) ? ATA_UDMA6 : ATA_SA300;
2686 KdPrint2((PRINT_PREFIX "p1 mode: %x\n", P1mode));
2687
2688 if(reg40 & (1 << 23)) {
2689 KdPrint2((PRINT_PREFIX "SATA+PATA0\n"));
2690 deviceExtension->chan[0 ^ c_swp].MaxTransferMode = P1mode;
2691 deviceExtension->chan[1 ^ c_swp].MaxTransferMode = ATA_UDMA6;
2692 deviceExtension->chan[1 ^ c_swp].ChannelCtrlFlags |= CTRFLAGS_NO_SLAVE;
2693
2694 } else {
2695 KdPrint2((PRINT_PREFIX "SATA+SATA\n"));
2696 deviceExtension->chan[0 ^ c_swp].MaxTransferMode = P1mode;
2697 //deviceExtension->chan[0 ^ c_swp].ChannelCtrlFlags |= CTRFLAGS_NO_SLAVE;
2698 deviceExtension->chan[1 ^ c_swp].MaxTransferMode = ATA_SA300;
2699 deviceExtension->chan[1 ^ c_swp].ChannelCtrlFlags |= CTRFLAGS_NO_SLAVE;
2700 }
2701
2702 } else {
2703 /*
2704 deviceExtension->chan[0 ^ c_swp].lun[0]->SATA_lun_map =
2705 deviceExtension->chan[0 ^ c_swp].lun[0]->SATA_lun_map = 0;
2706 deviceExtension->chan[1 ^ c_swp].lun[0]->SATA_lun_map =
2707 deviceExtension->chan[1 ^ c_swp].lun[0]->SATA_lun_map = 1;
2708 */
2709 KdPrint2((PRINT_PREFIX "chan %d\n", c));
2710 chan = &deviceExtension->chan[c];
2711
2712 UCHAR ph_channel = (UCHAR)(c ^ c_swp);
2713 //c_swp = chan->lun[0]->SATA_lun_map;
2714 if(chan->MaxTransferMode >= ATA_SA150) {
2715 KdPrint2((PRINT_PREFIX "SATA, map -> %x\n", ph_channel));
2716 } else {
2717 KdPrint2((PRINT_PREFIX "PATA, map -> %x\n", ph_channel));
2718 if(!ph_channel) {
2719 if(!(reg40 & (1<<5))) {
2720 KdPrint2((PRINT_PREFIX "disabled\n", ph_channel));
2721 } else
2722 if(!(reg40 & (1<<3))) {
2723 KdPrint2((PRINT_PREFIX "40-pin\n"));
2724 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2725 }
2726 } else {
2727 if(!(reg80 & (1<<21))) {
2728 KdPrint2((PRINT_PREFIX "disabled\n", ph_channel));
2729 } else
2730 if(!(reg80 & (1<<19))) {
2731 KdPrint2((PRINT_PREFIX "40-pin\n"));
2732 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
2733 }
2734 }
2735 }
2736 }
2737
2738 }
2739 break;
2740 default:
2741 if(c != CHAN_NOT_SPECIFIED) {
2742 // We don't know how to check for 80-pin cable on unknown controllers.
2743 // Later we shall check bit in IDENTIFY structure, but it is not reliable way.
2744 // So, leave this flag to use as hint in error recovery procedures
2745 KdPrint2((PRINT_PREFIX "UNIATA_NO80CHK\n"));
2746 deviceExtension->HwFlags |= UNIATA_NO80CHK;
2747 }
2748 break;
2749 }
2750
2751 // In all places separate channels are inited after common controller init
2752 // The only exception is probe. But there we may need info about 40/80 pin and MaxTransferRate
2753 // Do not check UNIATA_SATA here since we may have controller with mixed ports
2754 if(CheckCable && !(ChipFlags & (UNIATA_NO80CHK/* | UNIATA_SATA*/))) {
2755 for(c=0; c<deviceExtension->NumberChannels; c++) {
2756 AtapiChipInit(HwDeviceExtension, DeviceNumber, c);
2757 }
2758 }
2759
2760 return TRUE;
2761} // end AtapiChipInit()
unsigned char BOOLEAN
struct _HW_DEVICE_EXTENSION * PHW_DEVICE_EXTENSION
#define UNIATA_NO80CHK
Definition: bm_devs_decl.h:630
#define ITE_33
Definition: bm_devs_decl.h:722
#define ATA_JMB366
Definition: bm_devs_decl.h:324
#define SISSATA
Definition: bm_devs_decl.h:676
#define ATA_INTEL_ID
Definition: bm_devs_decl.h:184
#define ATA_CYRIX_ID
Definition: bm_devs_decl.h:168
#define NV4OFF
Definition: bm_devs_decl.h:697
#define ALINEW
Definition: bm_devs_decl.h:637
#define SIS33
Definition: bm_devs_decl.h:682
#define ATI700
Definition: bm_devs_decl.h:666
#define VIABAR
Definition: bm_devs_decl.h:709
#define PRNEW
Definition: bm_devs_decl.h:646
#define ICH5
Definition: bm_devs_decl.h:691
#define HPT372
Definition: bm_devs_decl.h:641
#define SIS133NEW
Definition: bm_devs_decl.h:677
#define NVQ
Definition: bm_devs_decl.h:698
#define ITE_133
Definition: bm_devs_decl.h:723
#define PRTX
Definition: bm_devs_decl.h:647
#define SIINOSATAIRQ
Definition: bm_devs_decl.h:673
#define CHIPTYPE_MASK
Definition: bm_devs_decl.h:620
#define SIS100OLD
Definition: bm_devs_decl.h:680
#define SIIMIO
Definition: bm_devs_decl.h:665
#define UNIATA_SATA
Definition: bm_devs_decl.h:626
#define PRG2
Definition: bm_devs_decl.h:654
#define HPTOLD
Definition: bm_devs_decl.h:643
#define SWKS33
Definition: bm_devs_decl.h:658
#define UNIATA_AHCI
Definition: bm_devs_decl.h:629
#define SIS100NEW
Definition: bm_devs_decl.h:679
#define ATA_JMB365
Definition: bm_devs_decl.h:323
#define PROLD
Definition: bm_devs_decl.h:645
#define ATA_PROMISE_ID
Definition: bm_devs_decl.h:454
#define ATA_VIA_ID
Definition: bm_devs_decl.h:571
#define VIAPRQ
Definition: bm_devs_decl.h:714
#define ATA_AMD_ID
Definition: bm_devs_decl.h:129
#define PRMIO
Definition: bm_devs_decl.h:648
#define VIASATA
Definition: bm_devs_decl.h:715
#define SIS66
Definition: bm_devs_decl.h:681
#define CYRIX_OLD
Definition: bm_devs_decl.h:717
#define ATA_JMB368
Definition: bm_devs_decl.h:325
#define ATA_SIS_ID
Definition: bm_devs_decl.h:521
#define I6CH2
Definition: bm_devs_decl.h:693
#define VIACLK
Definition: bm_devs_decl.h:710
#define ATA_NVIDIA_ID
Definition: bm_devs_decl.h:355
#define ATA_ATI_ID
Definition: bm_devs_decl.h:147
#define ATA_JMB361
Definition: bm_devs_decl.h:320
#define SIICMD
Definition: bm_devs_decl.h:664
#define ICH7
Definition: bm_devs_decl.h:695
#define ATA_JMB363
Definition: bm_devs_decl.h:322
#define VIA133
Definition: bm_devs_decl.h:705
#define SII4CH
Definition: bm_devs_decl.h:670
#define SWKS100
Definition: bm_devs_decl.h:660
#define ITE_133_NEW
Definition: bm_devs_decl.h:724
#define ATA_HIGHPOINT_ID
Definition: bm_devs_decl.h:177
#define SIISETCLK
Definition: bm_devs_decl.h:671
#define CHIPFLAG_MASK
Definition: bm_devs_decl.h:621
#define ATA_SILICON_IMAGE_ID
Definition: bm_devs_decl.h:507
#define AMDBUG
Definition: bm_devs_decl.h:708
#define VIABUG
Definition: bm_devs_decl.h:711
#define ATA_JMICRON_ID
Definition: bm_devs_decl.h:318
#define ATA_SERVERWORKS_ID
Definition: bm_devs_decl.h:494
#define SIS133OLD
Definition: bm_devs_decl.h:678
#define ATA_ITE_ID
Definition: bm_devs_decl.h:604
#define ATA_ACER_LABS_ID
Definition: bm_devs_decl.h:120
#define INTEL_IDX
Definition: bm_devs_decl.h:688
VOID DDKFASTAPI AtapiWritePortEx1(IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs, IN UCHAR data)
#define ChangePciConfig1(offs, _op)
Definition: bsmaster.h:1641
#define IDX_BM_DeviceSpecific1
Definition: bsmaster.h:170
#define ChangePciConfig4(offs, _op)
Definition: bsmaster.h:1699
#define IDX_BM_DeviceSpecific0
Definition: bsmaster.h:168
UCHAR DDKFASTAPI AtapiReadPort1(IN PHW_CHANNEL chan, IN ULONGIO_PTR port)
ULONG DDKFASTAPI AtapiReadPort4(IN PHW_CHANNEL chan, IN ULONGIO_PTR port)
#define GetPciConfig1(offs, op)
Definition: bsmaster.h:1620
VOID DDKFASTAPI AtapiWritePortEx4(IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs, IN ULONG data)
#define ChangePciConfig2(offs, _op)
Definition: bsmaster.h:1670
ULONG DDKFASTAPI AtapiReadPortEx4(IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs)
#define GetPciConfig4(offs, op)
Definition: bsmaster.h:1678
#define DEV_BSIZE
Definition: bsmaster.h:103
VOID DDKFASTAPI AtapiWritePort4(IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG data)
VOID DDKFASTAPI AtapiWritePort2(IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN USHORT data)
#define IDX_BM_Command
Definition: bsmaster.h:167
#define SetPciConfig2(offs, op)
Definition: bsmaster.h:1659
#define GetPciConfig2(offs, op)
Definition: bsmaster.h:1649
VOID DDKFASTAPI AtapiWritePort1(IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN UCHAR data)
#define CTRFLAGS_NO_SLAVE
Definition: bsmaster.h:1139
#define IDX_SATA_SError
Definition: bsmaster.h:458
USHORT NTAPI UniataEnableIoPCI(IN ULONG busNumber, IN ULONG slotNumber, IN OUT PPCI_COMMON_CONFIG pciData)
Definition: id_probe.cpp:95
UCHAR DDKFASTAPI AtapiReadPortEx1(IN PHW_CHANNEL chan, IN ULONGIO_PTR port, IN ULONG offs)
#define SetPciConfig1(offs, op)
Definition: bsmaster.h:1630
#define CTRFLAGS_DMA_RO
Definition: bsmaster.h:1132
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1230
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ULONGIO_PTR
Definition: config.h:102
NTHALAPI ULONG NTAPI HalGetBusData(BUS_DATA_TYPE, ULONG, ULONG, PVOID, ULONG)
#define WinVer_Id()
Definition: CrossNt.h:109
#define WinVer_NT
Definition: CrossNt.h:112
const GLubyte * c
Definition: glext.h:8905
BOOLEAN NTAPI generic_cable80(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG channel, IN ULONG pci_reg, IN ULONG bit_offs)
Definition: id_init.cpp:1645
ULONG NTAPI hpt_cable80(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG channel)
Definition: id_init.cpp:1544
BOOLEAN NTAPI AtapiChipInit(IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG channel)
Definition: id_init.cpp:1886
VOID NTAPI AtapiRosbSouthBridgeFixup(IN PVOID HwDeviceExtension, IN BUS_DATA_TYPE BusDataType, IN ULONG SystemIoBusNumber, IN ULONG slotNumber)
Definition: id_init.cpp:1440
VOID NTAPI AtapiAliSouthBridgeFixup(IN PVOID HwDeviceExtension, IN BUS_DATA_TYPE BusDataType, IN ULONG SystemIoBusNumber, IN ULONG slotNumber, IN ULONG c)
Definition: id_init.cpp:1492
VOID NTAPI AtapiViaSouthBridgeFixup(IN PVOID HwDeviceExtension, IN BUS_DATA_TYPE BusDataType, IN ULONG SystemIoBusNumber, IN ULONG slotNumber)
Definition: id_init.cpp:1375
VOID NTAPI UniataSataWritePort4(IN PHW_CHANNEL chan, IN ULONG io_port_ndx, IN ULONG data, IN ULONG pm_port)
Definition: id_sata.cpp:357
VOID NTAPI UniataAhciReset(IN PVOID HwDeviceExtension, IN ULONG lChannel)
Definition: id_sata.cpp:1925
BOOLEAN NTAPI UniataAhciInit(IN PVOID HwDeviceExtension)
Definition: id_sata.cpp:645
#define c
Definition: ke_i.h:80
#define min(a, b)
Definition: monoChain.cc:55
#define offsetof(TYPE, MEMBER)
ULONG ChannelCtrlFlags
Definition: bsmaster.h:1059
struct _HW_LU_EXTENSION * lun[IDE_MAX_LUN_PER_CHAN]
Definition: bsmaster.h:1088
BOOLEAN Force80pin
Definition: bsmaster.h:1048
ULONG MaxTransferMode
Definition: bsmaster.h:1057
ULONG NumberChannels
Definition: atapi.c:68
PHW_CHANNEL chan
Definition: bsmaster.h:1257
ULONG Addr
Definition: bsmaster.h:1009
static void GlobalInit()
Definition: treelist.c:438
#define ATA_UDMA2
Definition: atapi.h:330
#define ATA_SA150
Definition: atapi.h:337
#define AtapiStallExecution(dt)
Definition: atapi.h:158
#define CHAN_NOT_SPECIFIED_CHECK_CABLE
Definition: atapi.h:1482
#define ATA_SA300
Definition: atapi.h:338
#define KdPrint2(_x_)
Definition: atapi.h:154
#define ATA_UDMA6
Definition: atapi.h:334
#define CHAN_NOT_SPECIFIED
Definition: atapi.h:1481
#define ATA_UDMA5
Definition: atapi.h:333
#define PRINT_PREFIX
Definition: atapi.h:150
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceID
Definition: wdfpdo.h:278
#define PCI_COMMON_HDR_LENGTH
Definition: iotypes.h:3596

Referenced by AtapiAdapterControl(), AtapiChipInit(), AtapiFindIsaController(), AtapiHwInitialize(), AtapiHwInitialize__(), and UniataFindBusMasterController().

◆ AtapiDmaAlloc()

VOID NTAPI AtapiDmaAlloc ( IN PVOID  HwDeviceExtension,
IN PPORT_CONFIGURATION_INFORMATION  ConfigInfo,
IN ULONG  lChannel 
)

Definition at line 138 of file id_dma.cpp.

143{
144#ifdef USE_OWN_DMA
145 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
146 PHW_CHANNEL chan = &(deviceExtension->chan[lChannel]);
147 ULONG c = lChannel;
148 ULONG i;
149 ULONG ph_addru;
150
151 deviceExtension->chan[c].CopyDmaBuffer = FALSE;
152
153 if(!deviceExtension->Host64 && (WinVer_Id() > WinVer_NT)) {
154 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: allocate tmp buffers below 4Gb\n"));
155 if(chan->DB_PRD) {
156 KdPrint2((PRINT_PREFIX " already initialized %x\n", chan->DB_PRD));
157 return;
158 }
159 chan->DB_PRD = MmAllocateContiguousMemory(sizeof(((PATA_REQ)NULL)->dma_tab), ph4gb);
160 if(chan->DB_PRD) {
161 chan->DB_PRD_PhAddr = AtapiVirtToPhysAddr(HwDeviceExtension, NULL, (PUCHAR)(chan->DB_PRD), &i, &ph_addru);
162 if(!chan->DB_PRD_PhAddr || !i || ((LONG)(chan->DB_PRD_PhAddr) == -1)) {
163 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: No DB PRD BASE\n" ));
164 chan->DB_PRD = NULL;
165 chan->DB_PRD_PhAddr = 0;
166 return;
167 }
168 if(ph_addru) {
169 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: No DB PRD below 4Gb\n" ));
170 goto err_1;
171 }
172 }
174 if(chan->DB_IO) {
175 chan->DB_IO_PhAddr = AtapiVirtToPhysAddr(HwDeviceExtension, NULL, (PUCHAR)(chan->DB_IO), &i, &ph_addru);
176 if(!chan->DB_IO_PhAddr || !i || ((LONG)(chan->DB_IO_PhAddr) == -1)) {
177 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: No DB IO BASE\n" ));
178err_1:
180 chan->DB_PRD = NULL;
181 chan->DB_PRD_PhAddr = 0;
182 chan->DB_IO = NULL;
183 chan->DB_IO_PhAddr = 0;
184 return;
185 }
186 if(ph_addru) {
187 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: No DB IO below 4Gb\n" ));
189 goto err_1;
190 }
191 }
192 }
193
194
195 if(deviceExtension->HwFlags & UNIATA_AHCI) {
196 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: AHCI\n" ));
197 if(chan->AhciCtlBlock) {
198 KdPrint2((PRINT_PREFIX " already initialized %x\n", chan->AhciCtlBlock));
199 return;
200 }
201 // Need 1K-byte alignment
204 ph4gb);
205 if(chan->AhciCtlBlock0) {
206 union {
207 PUCHAR AhciCtlBlock;
208 ULONGLONG AhciCtlBlock64;
209 };
210 AhciCtlBlock64 = 0;
211 AhciCtlBlock = (PUCHAR)chan->AhciCtlBlock0;
212
213 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: CLP BASE %I64x\n", AhciCtlBlock64));
214
215 AhciCtlBlock64 += AHCI_CLB_ALIGNEMENT_MASK;
216 AhciCtlBlock64 &= ~AHCI_CLB_ALIGNEMENT_MASK;
217
218 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: CLP BASE 1k-aligned %I64x\n", AhciCtlBlock64));
219
220 chan->AhciCtlBlock = (PIDE_AHCI_CHANNEL_CTL_BLOCK)AhciCtlBlock;
221
222 chan->AHCI_CTL_PhAddr = AtapiVirtToPhysAddr(HwDeviceExtension, NULL, (PUCHAR)(chan->AhciCtlBlock), &i, &ph_addru);
223 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: CLP Phys BASE %I64x\n", chan->AHCI_CTL_PhAddr));
224 if(!chan->AHCI_CTL_PhAddr || !i || ((LONG)(chan->AHCI_CTL_PhAddr) == -1)) {
225 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: No AHCI CLP BASE\n" ));
226 chan->AhciCtlBlock = NULL;
227 chan->AHCI_CTL_PhAddr = 0;
228 return;
229 }
230 if(ph_addru) {
231 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: No AHCI CLP below 4Gb\n" ));
233 chan->AhciCtlBlock = NULL;
234 chan->AHCI_CTL_PhAddr = 0;
235 return;
236 }
237 } else {
238 KdPrint2((PRINT_PREFIX "AtapiDmaAlloc: Can't alloc AHCI CLP\n"));
239 }
240 }
241#endif //USE_OWN_DMA
242 return;
243} // end AtapiDmaAlloc()
#define AHCI_CLB_ALIGNEMENT_MASK
Definition: bsmaster.h:518
struct _IDE_AHCI_CHANNEL_CTL_BLOCK * PIDE_AHCI_CHANNEL_CTL_BLOCK
#define AtapiVirtToPhysAddr(hwde, srb, phaddr, plen, phaddru)
Definition: bsmaster.h:1716
PVOID NTAPI MmAllocateContiguousMemory(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
Definition: contmem.c:626
VOID NTAPI MmFreeContiguousMemory(IN PVOID BaseAddress)
Definition: contmem.c:653
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
PHYSICAL_ADDRESS ph4gb
Definition: id_dma.cpp:56
long LONG
Definition: pedump.c:60
PVOID DB_IO
Definition: bsmaster.h:1096
PVOID DB_PRD
Definition: bsmaster.h:1094
ULONG DB_PRD_PhAddr
Definition: bsmaster.h:1095
PIDE_AHCI_CHANNEL_CTL_BLOCK AhciCtlBlock0
Definition: bsmaster.h:1102
ULONGLONG AHCI_CTL_PhAddr
Definition: bsmaster.h:1104
PIDE_AHCI_CHANNEL_CTL_BLOCK AhciCtlBlock
Definition: bsmaster.h:1103
ULONG DB_IO_PhAddr
Definition: bsmaster.h:1097
BOOLEAN CopyDmaBuffer
Definition: bsmaster.h:1045
ULONG MaximumDmaTransferLength
Definition: bsmaster.h:1317
unsigned char * PUCHAR
Definition: typedefs.h:53
uint64_t ULONGLONG
Definition: typedefs.h:67

Referenced by UniataAhciInit(), and UniataFindBusMasterController().

◆ AtapiDmaDBPreSync()

BOOLEAN NTAPI AtapiDmaDBPreSync ( IN PVOID  HwDeviceExtension,
PHW_CHANNEL  chan,
PSCSI_REQUEST_BLOCK  Srb 
)

Definition at line 553 of file id_dma.cpp.

558{
559 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
560 PATA_REQ AtaReq = (PATA_REQ)(Srb->SrbExtension);
561
562 if(!AtaReq->ata.dma_base) {
563 KdPrint2((PRINT_PREFIX "AtapiDmaDBPreSync: *** !AtaReq->ata.dma_base\n"));
564 return FALSE;
565 }
566// GetStatus(chan, statusByte2);
567 if(AtaReq->Flags & REQ_FLAG_DMA_DBUF_PRD) {
568 KdPrint2((PRINT_PREFIX " DBUF_PRD\n"));
569 ASSERT(FALSE);
570 if(deviceExtension->HwFlags & UNIATA_AHCI) {
571 RtlCopyMemory(chan->DB_PRD, AtaReq->ahci.ahci_cmd_ptr, sizeof(AtaReq->ahci_cmd0));
572 } else {
573 RtlCopyMemory(chan->DB_PRD, &(AtaReq->dma_tab), sizeof(AtaReq->dma_tab));
574 }
575 }
576 if(!(Srb->SrbFlags & SRB_FLAGS_DATA_IN) &&
577 (AtaReq->Flags & REQ_FLAG_DMA_DBUF)) {
578 KdPrint2((PRINT_PREFIX " DBUF (Write)\n"));
579 ASSERT(FALSE);
580 RtlCopyMemory(chan->DB_IO, AtaReq->DataBuffer,
582 }
583 return TRUE;
584} // end AtapiDmaDBPreSync()
#define REQ_FLAG_DMA_DBUF
Definition: bsmaster.h:938
union _ATA_REQ * PATA_REQ
#define REQ_FLAG_DMA_DBUF_PRD
Definition: bsmaster.h:939
_In_ PSCSI_REQUEST_BLOCK Srb
Definition: cdrom.h:989
#define SRB_FLAGS_DATA_IN
Definition: srb.h:400
#define ASSERT(a)
Definition: mode.c:44
ULONG DataTransferLength
Definition: srb.h:261
PVOID SrbExtension
Definition: srb.h:267
ULONG SrbFlags
Definition: srb.h:260
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
IDE_AHCI_CMD ahci_cmd0
Definition: bsmaster.h:922
PUSHORT DataBuffer
Definition: bsmaster.h:882
struct _ATA_REQ::@1284::@1286::@1290::@1293 ahci
struct _ATA_REQ::@1284::@1286::@1290::@1292 ata
BM_DMA_ENTRY dma_tab[ATA_DMA_ENTRIES]
Definition: bsmaster.h:921
UCHAR Flags
Definition: bsmaster.h:892

Referenced by AtapiInterrupt__(), AtapiSendCommand(), IdeReadWrite(), and IdeSendCommand().

◆ AtapiDmaDBSync()

BOOLEAN NTAPI AtapiDmaDBSync ( PHW_CHANNEL  chan,
PSCSI_REQUEST_BLOCK  Srb 
)

Definition at line 532 of file id_dma.cpp.

536{
537 PATA_REQ AtaReq;
538
539 AtaReq = (PATA_REQ)(Srb->SrbExtension);
541 (AtaReq->Flags & REQ_FLAG_DMA_DBUF)) {
542 KdPrint2((PRINT_PREFIX " AtapiDmaDBSync is issued.\n"));
543 ASSERT(FALSE);
544 KdPrint2((PRINT_PREFIX " DBUF (Read)\n"));
545 RtlCopyMemory(AtaReq->DataBuffer, chan->DB_IO,
547 }
548 return TRUE;
549} // end AtapiDmaDBSync()

Referenced by AtapiCallBack__(), AtapiInterrupt__(), and AtapiStartIo__().

◆ AtapiDmaDone()

UCHAR NTAPI AtapiDmaDone ( IN PVOID  HwDeviceExtension,
IN ULONG  DeviceNumber,
IN ULONG  lChannel,
IN PSCSI_REQUEST_BLOCK  Srb 
)

Definition at line 685 of file id_dma.cpp.

691{
692 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
693 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM = deviceExtension->BaseIoAddressBM[lChannel];
694 PHW_CHANNEL chan = &deviceExtension->chan[lChannel];
695 UCHAR dma_status;
696
697 ULONG VendorID = deviceExtension->DevID & 0xffff;
698 ULONG ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK;
699
700 KdPrint2((PRINT_PREFIX "AtapiDmaDone: dev %d\n", DeviceNumber));
701
702 if(deviceExtension->HwFlags & UNIATA_AHCI) {
703 KdPrint2((PRINT_PREFIX " ACHTUNG! should not be called for AHCI!\n"));
704 return IDE_STATUS_WRONG;
705 }
706
707 switch(VendorID) {
708 case ATA_PROMISE_ID:
709 if(ChipType == PRNEW) {
710 ULONG Channel = deviceExtension->Channel + lChannel;
711/*
712 AtapiWritePortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11,
713 AtapiReadPortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11) &
714 ~(Channel ? 0x08 : 0x02));
715*/
716 if(chan->ChannelCtrlFlags & CTRFLAGS_LBA48) {
717 AtapiWritePortEx4(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),(Channel ? 0x24 : 0x20),
718 0
719 );
720 }
721/*
722 } else
723 if(deviceExtension->MemIo) {
724 // end transaction
725 AtapiWritePort4(chan,
726 IDX_BM_Command,
727 (AtapiReadPort4(chan,
728 IDX_BM_Command) & ~0x00000080) );
729 // clear flag
730 chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_ACTIVE;
731 return 0;
732*/
733 }
734 break;
735 }
736
737 // get status
738 dma_status = AtapiReadPort1(chan, IDX_BM_Status) & BM_STATUS_MASK;
739 // end transaction
743 // clear interrupt and error status
745 // clear flag
746 chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_ACTIVE;
747
748 return dma_status;
749
750} // end AtapiDmaDone()
#define BM_STATUS_ERR
Definition: bsmaster.h:143
#define BM_STATUS_MASK
Definition: bsmaster.h:145
#define IDX_BM_Status
Definition: bsmaster.h:169
#define CTRFLAGS_LBA48
Definition: bsmaster.h:1137
#define BM_STATUS_INTR
Definition: bsmaster.h:144
#define BM_COMMAND_START_STOP
Definition: bsmaster.h:150
#define IDE_STATUS_WRONG
Definition: atapi.h:430

Referenced by AtapiCheckInterrupt__(), AtapiInterrupt__(), AtapiResetController__(), AtapiSoftReset(), IdeSendCommand(), and UniataFindBusMasterController().

◆ AtapiDmaInit()

VOID NTAPI AtapiDmaInit ( IN PVOID  HwDeviceExtension,
IN ULONG  DeviceNumber,
IN ULONG  lChannel,
IN SCHAR  apiomode,
IN SCHAR  wdmamode,
IN SCHAR  udmamode 
)

Definition at line 975 of file id_dma.cpp.

984{
985 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
986 ULONG Channel = deviceExtension->Channel + lChannel;
987 PHW_CHANNEL chan = &deviceExtension->chan[lChannel];
988 //LONG statusByte = 0;
989 ULONG dev = Channel*2 + DeviceNumber; // for non-SATA/AHCI only!
990 //ULONG ldev = lChannel*2 + DeviceNumber; // for non-SATA/AHCI only!
991 BOOLEAN isAtapi = ATAPI_DEVICE(chan, DeviceNumber);
992 ULONG slotNumber = deviceExtension->slotNumber;
993 ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber;
994 LONG i;
995 PHW_LU_EXTENSION LunExt = chan->lun[DeviceNumber];
996 UCHAR ModeByte;
997
998 ULONG VendorID = deviceExtension->DevID & 0xffff;
999 //ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
1000 //ULONG RevID = deviceExtension->RevID;
1001 ULONG ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK;
1002 ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
1003
1004 LONG statusByte = 0;
1005
1006 //UCHAR *reg_val = NULL;
1007
1008 LunExt->DeviceFlags &= ~DFLAGS_REINIT_DMA;
1009 /* set our most pessimistic default mode */
1010 LunExt->TransferMode = ATA_PIO;
1011// if(!deviceExtension->BaseIoAddressBM[lChannel]) {
1012 if(!deviceExtension->BusMaster) {
1013 KdPrint2((PRINT_PREFIX " !deviceExtension->BusMaster: NO DMA\n"));
1014 wdmamode = udmamode = -1;
1015 }
1016
1017 // Limit transfer mode (controller limitation)
1018 if((LONG)chan->MaxTransferMode >= ATA_UDMA) {
1019 KdPrint2((PRINT_PREFIX "AtapiDmaInit: chan->MaxTransferMode >= ATA_UDMA\n"));
1020 udmamode = min( udmamode, (CHAR)(chan->MaxTransferMode - ATA_UDMA));
1021 } else
1022 if((LONG)chan->MaxTransferMode >= ATA_WDMA) {
1023 KdPrint2((PRINT_PREFIX "AtapiDmaInit: chan->MaxTransferMode >= ATA_WDMA\n"));
1024 udmamode = -1;
1025 wdmamode = min( wdmamode, (CHAR)(chan->MaxTransferMode - ATA_WDMA));
1026 } else
1027 if((LONG)chan->MaxTransferMode >= ATA_PIO0) {
1028 KdPrint2((PRINT_PREFIX "AtapiDmaInit: NO DMA\n"));
1029 wdmamode = udmamode = -1;
1030 apiomode = min( apiomode, (CHAR)(chan->MaxTransferMode - ATA_PIO0));
1031 } else {
1032 KdPrint2((PRINT_PREFIX "AtapiDmaInit: PIO0\n"));
1033 wdmamode = udmamode = -1;
1034 apiomode = 0;
1035 }
1036 // Limit transfer mode (device limitation)
1037 KdPrint2((PRINT_PREFIX "AtapiDmaInit: LunExt->LimitedTransferMode %#x\n", LunExt->LimitedTransferMode));
1038 if((LONG)LunExt->LimitedTransferMode >= ATA_UDMA) {
1039 KdPrint2((PRINT_PREFIX "AtapiDmaInit: LunExt->MaxTransferMode >= ATA_UDMA => %#x\n",
1040 min( udmamode, (CHAR)(LunExt->LimitedTransferMode - ATA_UDMA))
1041 ));
1042 udmamode = min( udmamode, (CHAR)(LunExt->LimitedTransferMode - ATA_UDMA));
1043 } else
1044 if((LONG)LunExt->LimitedTransferMode >= ATA_WDMA) {
1045 KdPrint2((PRINT_PREFIX "AtapiDmaInit: LunExt->MaxTransferMode >= ATA_WDMA => %#x\n",
1046 min( wdmamode, (CHAR)(LunExt->LimitedTransferMode - ATA_WDMA))
1047 ));
1048 udmamode = -1;
1049 wdmamode = min( wdmamode, (CHAR)(LunExt->LimitedTransferMode - ATA_WDMA));
1050 } else
1051 if((LONG)LunExt->LimitedTransferMode >= ATA_PIO0) {
1052 KdPrint2((PRINT_PREFIX "AtapiDmaInit: lun NO DMA\n"));
1053 wdmamode = udmamode = -1;
1054 apiomode = min( apiomode, (CHAR)(LunExt->LimitedTransferMode - ATA_PIO0));
1055 } else {
1056 KdPrint2((PRINT_PREFIX "AtapiDmaInit: lun PIO0\n"));
1057 wdmamode = udmamode = -1;
1058 apiomode = 0;
1059 }
1060
1061 //if(!(ChipFlags & UNIATA_AHCI)) {
1062
1063 // this is necessary for future PM support
1065 GetStatus(chan, statusByte);
1066 // we can see here IDE_STATUS_ERROR status after previous operation
1067 if(statusByte & IDE_STATUS_ERROR) {
1068 KdPrint2((PRINT_PREFIX "IDE_STATUS_ERROR detected on entry, statusByte = %#x\n", statusByte));
1069 //GetBaseStatus(chan, statusByte);
1070 }
1071 if(statusByte && UniataIsIdle(deviceExtension, statusByte & ~IDE_STATUS_ERROR) != IDE_STATUS_IDLE) {
1072 KdPrint2((PRINT_PREFIX "Can't setup transfer mode: statusByte = %#x\n", statusByte));
1073 return;
1074 }
1075 //}
1076
1077 chan->last_cdev = DeviceNumber;
1078 if(UniataIsSATARangeAvailable(deviceExtension, lChannel) ||
1079 (ChipFlags & UNIATA_AHCI) || (chan->MaxTransferMode >= ATA_SA150)
1080 ) {
1081 //if(ChipFlags & (UNIATA_SATA | UNIATA_AHCI)) {
1082 /****************/
1083 /* SATA Generic */
1084 /****************/
1085
1086 KdPrint2((PRINT_PREFIX "SATA Generic\n"));
1087
1088 if((udmamode >= 5) || (ChipFlags & UNIATA_AHCI) || ((udmamode >= 0) && (chan->MaxTransferMode >= ATA_SA150))) {
1089 /* some drives report UDMA6, some UDMA5 */
1090 /* ATAPI may not have SataCapabilities set in IDENTIFY DATA */
1091 if(ata_is_sata(&(LunExt->IdentifyData))) {
1092 //udmamode = min(udmamode, 6);
1093 KdPrint2((PRINT_PREFIX "LunExt->LimitedTransferMode %x, LunExt->OrigTransferMode %x\n",
1094 LunExt->LimitedTransferMode, LunExt->OrigTransferMode));
1095 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, min(LunExt->LimitedTransferMode, LunExt->OrigTransferMode))) {
1096 return;
1097 }
1098 udmamode = min(udmamode, 6);
1099
1100 } else {
1101 KdPrint2((PRINT_PREFIX "SATA -> PATA adapter ?\n"));
1102 if (udmamode > 2 && (!LunExt->IdentifyData.HwResCableId && (LunExt->IdentifyData.HwResValid == IDENTIFY_CABLE_ID_VALID) )) {
1103 KdPrint2((PRINT_PREFIX "AtapiDmaInit: DMA limited to UDMA33, non-ATA66 compliant cable\n"));
1104 udmamode = 2;
1105 apiomode = min( apiomode, (CHAR)(LunExt->LimitedTransferMode - ATA_PIO0));
1106 } else {
1107 udmamode = min(udmamode, 6);
1108 }
1109 }
1110 }
1111 if(udmamode >= 0) {
1112 ModeByte = ATA_UDMA0 + udmamode;
1113 } else
1114 if(wdmamode >= 0) {
1115 ModeByte = ATA_WDMA0 + wdmamode;
1116 } else
1117 if(apiomode >= 0) {
1118 ModeByte = ATA_PIO0 + apiomode;
1119 } else {
1120 ModeByte = ATA_PIO;
1121 }
1122
1123 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ModeByte);
1124 return;
1125 }
1126
1127 if(deviceExtension->UnknownDev) {
1128 KdPrint2((PRINT_PREFIX "Unknown chip, omit Vendor/Dev checks\n"));
1129 goto try_generic_dma;
1130 }
1131
1132 if(udmamode > 2 && (!LunExt->IdentifyData.HwResCableId && (LunExt->IdentifyData.HwResValid == IDENTIFY_CABLE_ID_VALID)) ) {
1133 if(ata_is_sata(&(LunExt->IdentifyData))) {
1134 KdPrint2((PRINT_PREFIX "AtapiDmaInit: SATA beyond adapter or Controller compat mode\n"));
1135 } else {
1136 KdPrint2((PRINT_PREFIX "AtapiDmaInit: DMA limited to UDMA33, non-ATA66 compliant cable\n"));
1137 udmamode = 2;
1138 apiomode = min( apiomode, (CHAR)(LunExt->LimitedTransferMode - ATA_PIO));
1139 }
1140 }
1141
1142 KdPrint2((PRINT_PREFIX "Setup chip a:w:u=%d:%d:%d\n",
1143 apiomode,
1144 wdmamode,
1145 udmamode));
1146
1147 switch(VendorID) {
1148 case ATA_ACARD_ID: {
1149 /*********/
1150 /* Acard */
1151 /*********/
1152 static const USHORT reg4a = 0xa6;
1153 UCHAR reg = 0x40 + (UCHAR)dev;
1154
1155 if(ChipType == ATPOLD) {
1156 /* Old Acard 850 */
1157 static const USHORT reg4x2 = 0x0301;
1158
1159 for(i=udmamode; i>=0; i--) {
1160 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA + i)) {
1161set_old_acard:
1162 ChangePciConfig1(0x54, a | (0x01 << dev) | ((i+1) << (dev*2)));
1163 SetPciConfig1(0x4a, reg4a);
1164 SetPciConfig2(reg, reg4x2);
1165 return;
1166 }
1167
1168 }
1169 if (wdmamode >= 2 && apiomode >= 4) {
1170 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA2)) {
1171 goto set_old_acard;
1172 }
1173 }
1174 } else {
1175 /* New Acard 86X */
1176 static const UCHAR reg4x = 0x31;
1177
1178 for(i=udmamode; i>=0; i--) {
1179 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA + i)) {
1180set_new_acard:
1181 ChangePciConfig2(0x44, (a & ~(0x000f << (dev * 4))) | ((i+1) << (dev*4)));
1182 SetPciConfig1(0x4a, reg4a);
1183 SetPciConfig1(reg, reg4x);
1184 return;
1185 }
1186
1187 }
1188 if (wdmamode >= 2 && apiomode >= 4) {
1189 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA2)) {
1190 goto set_new_acard;
1191 }
1192 }
1193 }
1194 /* Use GENERIC PIO */
1195 break; }
1196 case ATA_ACER_LABS_ID: {
1197 /************************/
1198 /* Acer Labs Inc. (ALI) */
1199 /************************/
1200 static const UCHAR ali_udma[] = {0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f};
1201 static const ULONG ali_pio[] =
1202 { 0x006d0003, 0x00580002, 0x00440001, 0x00330001,
1203 0x00310001, 0x00440001};
1204 /* the older Aladdin doesn't support ATAPI DMA on both master & slave */
1205 if ((ChipFlags & ALIOLD) &&
1206 (udmamode >= 0 || wdmamode >= 0)) {
1207 if(ATAPI_DEVICE(chan, 0) &&
1208 ATAPI_DEVICE(chan, 1)) {
1209 // 2 devices on this channel - NO DMA
1210 chan->MaxTransferMode =
1212 udmamode = wdmamode = -1;
1213 break;
1214 }
1215 }
1216 for(i=udmamode; i>=0; i--) {
1217 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1218 ULONG word54;
1219
1220 GetPciConfig4(0x54, word54);
1221 word54 &= ~(0x000f000f << (dev * 4));
1222 word54 |= (((ali_udma[i]<<16) | 5) << (dev * 4));
1223 SetPciConfig4(0x54, word54);
1224 ChangePciConfig1(0x53, a | 0x03);
1225 SetPciConfig4(0x58 + (Channel<<2), 0x00310001);
1226 return;
1227 }
1228 }
1229 /* make sure eventual UDMA mode from the BIOS is disabled */
1230 ChangePciConfig2(0x56, a & ~(0x0008 << (dev * 4)) );
1231 if (wdmamode >= 2 && apiomode >= 4) {
1232 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA2)) {
1233 ChangePciConfig1(0x53, a | 0x03);
1235 return;
1236 }
1237 }
1238 ChangePciConfig1(0x53, (a & ~0x01) | 0x02);
1239
1240 for(i=apiomode; i>=0; i--) {
1241 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + i)) {
1242 ChangePciConfig4(0x54, a & ~(0x0008000f << (dev * 4)));
1243 SetPciConfig4(0x58 + (Channel<<2), ali_pio[i]);
1244 return;
1245 }
1246 }
1247 return;
1248 break; }
1249 case ATA_AMD_ID:
1250 case ATA_NVIDIA_ID:
1251 case ATA_VIA_ID: {
1252 /********************/
1253 /* AMD, nVidia, VIA */
1254 /********************/
1255 if(VendorID == ATA_VIA_ID) {
1256 if((ChipFlags & VIASATA) &&
1257 (Channel == 0)) {
1258 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_SA150);
1259 return;
1260 }
1261 if((ChipFlags & VIABAR) &&
1262 (Channel < 2)) {
1263 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_SA150);
1264 return;
1265 }
1266 }
1267
1268 static const UCHAR via_modes[6][7] = {
1269 { 0xc2, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00 }, /* ATA33 and New Chips */
1270 { 0xee, 0xec, 0xea, 0xe9, 0xe8, 0x00, 0x00 }, /* ATA66 */
1271 { 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0x00 }, /* ATA100 */
1272 { 0xf7, 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0 }, /* VIA ATA133 */
1273 { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }, /* AMD/nVIDIA */
1274 { 0xee, 0xe8, 0xe6, 0xe4, 0xe2, 0xe1, 0xe0 }}; /* VIA new */
1275 static const UCHAR via_pio[] =
1276 { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20,
1277 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
1278 const UCHAR *reg_val = NULL;
1279 UCHAR reg = 0x53-(UCHAR)dev;
1280 UCHAR reg2 = reg-0x08;
1281
1282 if(ChipFlags & VIABAR) {
1283 reg = 0xb3;
1284 reg2 = 0xab;
1285 }
1286
1287 reg_val = &via_modes[ChipType][0];
1288
1289 if(VendorID == ATA_NVIDIA_ID) {
1290 reg += 0x10;
1291 reg2 += 0x10;
1292 }
1293
1294 for(i = udmamode; i>=0; i--) {
1295 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1296 SetPciConfig1(reg2, via_pio[8+i]);
1297 SetPciConfig1(reg, (UCHAR)reg_val[i]);
1298 return;
1299 }
1300 }
1301 if(!(ChipFlags & VIABAR)) {
1302 /* This chip can't do WDMA. */
1303 for(i = wdmamode; i>=0; i--) {
1304 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1305 SetPciConfig1(reg2, via_pio[5+i]);
1306 SetPciConfig1(reg, 0x8b);
1307 return;
1308 }
1309 }
1310 }
1311 /* set PIO mode timings */
1312 if((apiomode >= 0) && (ChipType != VIA133)) {
1313 SetPciConfig1(reg2, via_pio[apiomode]);
1314 }
1315 if(VendorID == ATA_VIA_ID /*&& (ChipType == VIA33 || ChipType == VIA66)*/) {
1316 via82c_timing(deviceExtension, dev, ATA_PIO0 + apiomode);
1317 }
1318 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1319 return;
1320
1321 break; }
1322 case ATA_CYRIX_ID: {
1323 /*********/
1324 /* Cyrix */
1325 /*********/
1326dma_cs55xx:
1327 if(apiomode >= 4)
1328 apiomode = 4;
1329
1330 if(ChipType == CYRIX_3x) {
1331#ifdef __REACTOS__
1332 static const ULONG cyr_piotiming[] =
1333 { 0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010 };
1334 static const ULONG cyr_wdmatiming[] = { 0x00077771, 0x00012121, 0x00002020 };
1335 static const ULONG cyr_udmatiming[] = { 0x00921250, 0x00911140, 0x00911030 };
1336#else
1337 ULONG cyr_piotiming[] =
1338 { 0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010 };
1339 ULONG cyr_wdmatiming[] = { 0x00077771, 0x00012121, 0x00002020 };
1340 ULONG cyr_udmatiming[] = { 0x00921250, 0x00911140, 0x00911030 };
1341#endif
1342 ULONG mode_reg = 0x24+(dev << 3);
1343
1344 for(i=udmamode; i>=0; i--) {
1345 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1346 AtapiWritePortEx4(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0), mode_reg, cyr_udmatiming[udmamode]);
1347 return;
1348 }
1349 }
1350 for(i=wdmamode; i>=0; i--) {
1351 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1352 AtapiWritePortEx4(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0), mode_reg, cyr_wdmatiming[wdmamode]);
1353 return;
1354 }
1355 }
1356 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode)) {
1357 AtapiWritePortEx4(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0), mode_reg, cyr_piotiming[apiomode]);
1358 return;
1359 }
1360 } else
1361 if(ChipType == CYRIX_OLD) {
1362#ifdef __REACTOS__
1363 static const UCHAR cyr_piotiming_old[] = { 11, 6, 3, 2, 1 };
1364#else
1365 UCHAR cyr_piotiming_old[] =
1366 { 11, 6, 3, 2, 1 };
1367#endif
1368 UCHAR timing;
1369
1370 for(i=wdmamode; i>=0; i--) {
1371 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1372 return;
1373 }
1374 }
1375 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode)) {
1376 timing = (6-apiomode) | (cyr_piotiming_old[i]);
1377 /* Channel command timing */
1378 SetPciConfig1(0x62+Channel, timing);
1379 /* Read command timing */
1380 SetPciConfig1(0x64+Channel*4+dev, timing);
1381 /* Write command timing */
1382 SetPciConfig1(0x66+Channel*4+dev, timing);
1383 return;
1384 }
1385 } else
1386 if(ChipType == CYRIX_35) {
1387/*
1388 USHORT c35_pio_timings[5] = {
1389 0xF7F4, 0xF173, 0x8141, 0x5131, 0x1131
1390 };
1391 USHORT c35_pio_cmd_timings[5] = {
1392 0xF7F4, 0x53F3, 0x13F1, 0x5131, 0x1131
1393 };
1394 ULONG c35_udma_timings[5] = {
1395 0x7F7436A1, 0x7F733481, 0x7F723261, 0x7F713161, 0x7F703061
1396 };
1397 ULONG c35_mwdma_timings[3] = {
1398 0x7F0FFFF3, 0x7F035352, 0x7F024241
1399 };
1400 ULONG mode_reg = 0x24+(dev << 3);
1401*/
1402 /* No MSR support yet, do not touch any regs */
1403 for(i=udmamode; i>=0; i--) {
1404 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1405 return;
1406 }
1407 }
1408 for(i=wdmamode; i>=0; i--) {
1409 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1410 return;
1411 }
1412 }
1413 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode)) {
1414 return;
1415 }
1416 }
1417 return;
1418
1419 break; }
1420 case ATA_NATIONAL_ID: {
1421 /************/
1422 /* National */
1423 /************/
1424 if(!ChipType) {
1425#ifdef __REACTOS__
1426 static const ULONG nat_piotiming[] =
1427 { 0x9172d132, 0x21717121, 0x00803020, 0x20102010, 0x00100010, 0x00803020,
1428 0x20102010, 0x00100010, 0x00100010, 0x00100010, 0x00100010 };
1429 static const ULONG nat_dmatiming[] = { 0x80077771, 0x80012121, 0x80002020 };
1430 static const ULONG nat_udmatiming[] = { 0x80921250, 0x80911140, 0x80911030 };
1431#else
1432 ULONG nat_piotiming[] =
1433 { 0x9172d132, 0x21717121, 0x00803020, 0x20102010, 0x00100010,
1434 0x00803020, 0x20102010, 0x00100010,
1435 0x00100010, 0x00100010, 0x00100010 };
1436 ULONG nat_dmatiming[] = { 0x80077771, 0x80012121, 0x80002020 };
1437 ULONG nat_udmatiming[] = { 0x80921250, 0x80911140, 0x80911030 };
1438#endif
1439
1440 if(apiomode >= 4)
1441 apiomode = 4;
1442 for(i=udmamode; i>=0; i--) {
1443 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1444 SetPciConfig4(0x44 + (dev * 8), nat_udmatiming[i]);
1445 SetPciConfig4(0x40 + (dev * 8), nat_piotiming[i+8]);
1446 return;
1447 }
1448 }
1449 for(i=wdmamode; i>=0; i--) {
1450 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1451 SetPciConfig4(0x44 + (dev * 8), nat_dmatiming[i]);
1452 SetPciConfig4(0x40 + (dev * 8), nat_piotiming[i+5]);
1453 return;
1454 }
1455 }
1456 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode)) {
1457 ChangePciConfig4(0x44 + (dev * 8), a | 0x80000000);
1458 SetPciConfig4(0x40 + (dev * 8), nat_piotiming[apiomode]);
1459 return;
1460 }
1461 } else {
1462 goto dma_cs55xx;
1463 }
1464 /* Use GENERIC PIO */
1465 break; }
1466 case ATA_CYPRESS_ID:
1467 /***********/
1468 /* Cypress */
1469 /***********/
1470 if (wdmamode >= 2 && apiomode >= 4) {
1471 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA2)) {
1472 SetPciConfig2(Channel ? 0x4e:0x4c, 0x2020);
1473 return;
1474 }
1475 }
1476 /* Use GENERIC PIO */
1477 break;
1478 case ATA_MARVELL_ID:
1479 /***********/
1480 /* Marvell */
1481 /***********/
1482 for(i=udmamode; i>=0; i--) {
1483 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1484 return;
1485 }
1486 }
1487 for(i=wdmamode; i>=0; i--) {
1488 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1489 return;
1490 }
1491 }
1492 /* try generic DMA, use hpt_timing() */
1493 if (wdmamode >= 0 && apiomode >= 4) {
1494 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_DMA)) {
1495 return;
1496 }
1497 }
1498 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1499 return;
1500 break;
1501 case ATA_NETCELL_ID:
1502 /***********/
1503 /* NetCell */
1504 /***********/
1505 if (wdmamode >= 2 && apiomode >= 4) {
1506 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA2)) {
1507 return;
1508 }
1509 }
1510 /* Use GENERIC PIO */
1511 break;
1512 case ATA_HIGHPOINT_ID: {
1513 /********************/
1514 /* High Point (HPT) */
1515 /********************/
1516 for(i=udmamode; i>=0; i--) {
1517 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1518 hpt_timing(deviceExtension, dev, (UCHAR)(ATA_UDMA + i)); // ???
1519 return;
1520 }
1521 }
1522
1523 for(i=wdmamode; i>=0; i--) {
1524 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1525 hpt_timing(deviceExtension, dev, (UCHAR)(ATA_WDMA0+i));
1526 return;
1527 }
1528 }
1529 /* try generic DMA, use hpt_timing() */
1530 if (wdmamode >= 0 && apiomode >= 4) {
1531 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_DMA)) {
1532 return;
1533 }
1534 }
1535 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1536 hpt_timing(deviceExtension, dev, ATA_PIO0 + apiomode);
1537 return;
1538 break; }
1539 case ATA_INTEL_ID: {
1540 /*********/
1541 /* Intel */
1542 /*********/
1543
1544 KdPrint2((PRINT_PREFIX "Intel %d\n", Channel));
1545 BOOLEAN udma_ok = FALSE;
1546 ULONG idx = 0;
1547 ULONG reg40;
1548 UCHAR reg44;
1549 USHORT reg48;
1550 USHORT reg4a;
1551 USHORT reg54;
1552 ULONG mask40 = 0;
1553 ULONG new40 = 0;
1554 UCHAR mask44 = 0;
1555 UCHAR new44 = 0;
1556#ifdef __REACTOS__
1557 static const UCHAR intel_timings[] =
1558 { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23 };
1559 static const UCHAR intel_utimings[] = { 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02 };
1560#else
1561 UCHAR intel_timings[] = { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23,
1562 0x23, 0x23, 0x23, 0x23, 0x23, 0x23 };
1563 UCHAR intel_utimings[] = { 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02 };
1564#endif
1565 const UCHAR needed_pio[3] = {
1567 };
1568
1569 if(deviceExtension->DevID == ATA_I82371FB) {
1570 KdPrint2((PRINT_PREFIX " I82371FB\n"));
1571 USHORT reg4x;
1572 USHORT control=0;
1573 for(i=wdmamode; i>=0; i--) {
1574 idx = 5+i;
1575 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1576 udma_ok = TRUE;
1577 break;
1578 }
1579 }
1580 if(!udma_ok) {
1581 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1582 idx = apiomode;
1583 } else {
1584 /* If the drive MWDMA is faster than it can do PIO then
1585 we must force PIO into PIO0 */
1586 if (apiomode < needed_pio[wdmamode]) {
1587 /* Enable DMA timing only */
1588 control |= 8; /* PIO cycles in PIO0 */
1589 }
1590 }
1591 GetPciConfig2(0x40+Channel*2, reg4x);
1592 if(apiomode > ATA_PIO0) {
1593 control |= 0x03; /* IORDY|TIME0 */
1594 } else {
1595 control |= 0x02; /* IORDY */
1596 }
1597 // if (ata_pio_need_iordy(adev))
1598 //control |= 2; /* IE */
1599 if (!isAtapi) {
1600 control |= 4; /* PPE enable */
1601 }
1602 /* Mask out the relevant control and timing bits we will load. Also
1603 clear the other drive TIME register as a precaution */
1604 reg4x &= 0xCC00 | (0x0E << (DeviceNumber*4));
1605 reg4x |= control << (DeviceNumber*4);
1606 reg4x |= intel_timings[idx] << 8;
1607 SetPciConfig2(0x40+Channel*2, reg4x);
1608 return;
1609 }
1610
1611 if(deviceExtension->DevID == ATA_ISCH) {
1612 ULONG tim;
1613 KdPrint2((PRINT_PREFIX " ISCH\n"));
1614 GetPciConfig4(0x80 + dev*4, tim);
1615
1616 for(i=udmamode; i>=0; i--) {
1617 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1618 tim |= (0x1 << 31);
1619 tim &= ~(0x7 << 16);
1620 tim |= (i << 16);
1621
1622 idx = i+8;
1623 udma_ok = TRUE;
1624 apiomode = ATA_PIO4;
1625 break;
1626 }
1627 }
1628 if(!udma_ok) {
1629 for(i=wdmamode; i>=0; i--) {
1630 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1631 tim &= ~(0x1 << 31);
1632 tim &= ~(0x3 << 8);
1633 tim |= (i << 8);
1634
1635 idx = i+5;
1636 udma_ok = TRUE;
1637 apiomode = (i == 0) ? ATA_PIO0 :
1638 (i == 1) ? ATA_PIO3 : ATA_PIO4;
1639 break;
1640 }
1641 }
1642 }
1643 if(!udma_ok) {
1644 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1645 idx = apiomode;
1646 }
1647 tim &= ~(0x7);
1648 tim |= (apiomode & 0x7);
1649 SetPciConfig4(0x80 + dev*4, tim);
1650
1651 return;
1652 }
1653
1654 GetPciConfig2(0x48, reg48);
1655// if(!(ChipFlags & ICH4_FIX)) {
1656 GetPciConfig2(0x4a, reg4a);
1657// }
1658 GetPciConfig2(0x54, reg54);
1659// if(udmamode >= 0) {
1660 // enable the write buffer to be used in a split (ping/pong) manner.
1661 reg54 |= 0x400;
1662// } else {
1663// reg54 &= ~0x400;
1664// }
1665
1666// reg40 &= ~0x00ff00ff;
1667// reg40 |= 0x40774077;
1668
1669 for(i=udmamode; i>=0; i--) {
1670 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1671
1672 /* Set UDMA reference clock (33 MHz or more). */
1673 SetPciConfig1(0x48, reg48 | (0x0001 << dev));
1674// if(!(ChipFlags & ICH4_FIX)) {
1675 if(deviceExtension->MaxTransferMode == ATA_UDMA3) {
1676 // Special case (undocumented overclock !) for PIIX4e
1677 SetPciConfig2(0x4a, (reg4a | (0x03 << (dev<<2)) ) );
1678 } else {
1679 SetPciConfig2(0x4a, (reg4a & ~(0x03 << (dev<<2))) |
1680 (((USHORT)(intel_utimings[i])) << (dev<<2) ) );
1681 }
1682// }
1683 /* Set UDMA reference clock (66 MHz or more). */
1684 reg54 &= ~(0x1001 << dev);
1685 if(i > 2) {
1686 reg54 |= (0x1 << dev);
1687 }
1688 /* Set UDMA reference clock (133 MHz). */
1689 if(i >= 5) {
1690 reg54 |= (0x1000 << dev);
1691 }
1692 SetPciConfig2(0x54, reg54);
1693
1694 udma_ok = TRUE;
1695 idx = i+8;
1696 if(ChipFlags & ICH4_FIX) {
1697 KdPrint2((PRINT_PREFIX " ICH4_FIX udma\n"));
1698 return;
1699 }
1700 break;
1701 }
1702 }
1703
1704 if(!udma_ok) {
1705 SetPciConfig1(0x48, reg48 & ~(0x0001 << dev));
1706 if(!(ChipFlags & ICH4_FIX)) {
1707 SetPciConfig2(0x4a, (reg4a & ~(0x3 << (dev << 2))) );
1708 }
1709 SetPciConfig2(0x54, reg54 & ~(0x1001 << dev));
1710 for(i=wdmamode; i>=0; i--) {
1711 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1712 udma_ok = TRUE;
1713 idx = i+5;
1714 if(ChipFlags & ICH4_FIX) {
1715 KdPrint2((PRINT_PREFIX " ICH4_FIX wdma\n"));
1716 return;
1717 }
1718 break;
1719 }
1720 }
1721 }
1722
1723 if(!udma_ok) {
1724 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1725 idx = apiomode;
1726 }
1727
1728 GetPciConfig4(0x40, reg40);
1729 GetPciConfig1(0x44, reg44);
1730
1731 /* Allow PIO/WDMA timing controls. */
1732 reg40 &= ~0x00ff00ff;
1733 reg40 |= 0x40774077;
1734
1735 mask40 = 0x000000ff;
1736 /* Set PIO/WDMA timings. */
1737 if(!(DeviceNumber & 1)) {
1738 mask40 = 0x00003300;
1739 new40 = ((USHORT)(intel_timings[idx]) << 8);
1740 } else {
1741 mask44 = 0x0f;
1742 new44 = ((intel_timings[idx] & 0x30) >> 2) |
1743 (intel_timings[idx] & 0x03);
1744 }
1745
1746 if (Channel) {
1747 mask40 <<= 16;
1748 new40 <<= 16;
1749 mask44 <<= 4;
1750 new44 <<= 4;
1751 }
1752
1753 KdPrint2((PRINT_PREFIX " 0x40 %x/%x, 0x44 %x/%x\n", mask40, new40, mask44, new44));
1754 SetPciConfig4(0x40, (reg40 & ~mask40) | new40);
1755 SetPciConfig1(0x44, (reg44 & ~mask44) | new44);
1756
1757 return;
1758 break; }
1759 case ATA_PROMISE_ID: {
1760 /***********/
1761 /* Promise */
1762 /***********/
1763
1764 UCHAR sel66 = Channel ? 0x08: 0x02;
1765
1766 if(ChipType < PRTX) {
1767 if (isAtapi) {
1768 udmamode =
1769 wdmamode = -1;
1770 }
1771 }
1772 for(i=udmamode; i>=0; i--) {
1773
1774 if(ChipType == PRNEW) {
1775 if(i>2) {
1776 AtapiWritePortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11,
1777 AtapiReadPortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11) |
1778 sel66);
1779 } else {
1780 AtapiWritePortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11,
1781 AtapiReadPortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11) &
1782 ~sel66);
1783 }
1784 }
1785
1786 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1787 promise_timing(deviceExtension, dev, (UCHAR)(ATA_UDMA + i)); // ???
1788 return;
1789 }
1790 }
1791 if(ChipType == PRNEW) {
1792 AtapiWritePortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11,
1793 AtapiReadPortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11) &
1794 ~sel66);
1795 }
1796 for(i=wdmamode; i>=0; i--) {
1797 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1798 promise_timing(deviceExtension, dev, (UCHAR)(ATA_WDMA0+i));
1799 return;
1800 }
1801 }
1802 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1803 promise_timing(deviceExtension, dev, ATA_PIO0 + apiomode);
1804 return;
1805 break; }
1806 case ATA_ATI_ID:
1807
1808 KdPrint2((PRINT_PREFIX "ATI\n"));
1809 if(ChipType == SIIMIO) {
1810 goto l_ATA_SILICON_IMAGE_ID;
1811 }
1812 //goto ATA_SERVERWORKS_ID;
1813 // FALL THROUGH
1814
1815 //break; }
1816
1817 case ATA_SERVERWORKS_ID: {
1818 /***************/
1819 /* ServerWorks */
1820 /***************/
1821// static const ULONG udma_modes[] = { 0x70, 0x21, 0x20 };
1822 static const ULONG sw_dma_modes[] = { 0x70, 0x21, 0x20 };
1823 static const ULONG sw_pio_modes[] = { 0x5d, 0x47, 0x34, 0x22, 0x20, 0x34, 0x22, 0x20,
1824 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
1825 USHORT reg56;
1826 ULONG reg44;
1827 ULONG reg40;
1828 ULONG offset = dev ^ 0x01;
1829 ULONG bit_offset = offset * 8;
1830
1831 for(i=udmamode; i>=0; i--) {
1832 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1833 GetPciConfig2(0x56, reg56);
1834 reg56 &= ~(0xf << (dev * 4));
1835 reg56 |= ((USHORT)i << (dev * 4));
1836 SetPciConfig2(0x56, reg56);
1837 ChangePciConfig1(0x54, a | (0x01 << dev));
1838 // 44
1839 GetPciConfig4(0x44, reg44);
1840 reg44 = (reg44 & ~(0xff << bit_offset)) |
1841 (sw_dma_modes[2] << bit_offset);
1842 SetPciConfig4(0x44, reg44);
1843 // 40
1844 GetPciConfig4(0x40, reg40);
1845 reg40 = (reg40 & ~(0xff << bit_offset)) |
1846 (sw_pio_modes[8+i] << bit_offset);
1847 SetPciConfig4(0x40, reg40);
1848 return;
1849 }
1850 }
1851
1852 for(i=wdmamode; i>=0; i--) {
1853 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1854
1855 ChangePciConfig1(0x54, a & ~(0x01 << dev));
1856 // 44
1857 GetPciConfig4(0x44, reg44);
1858 reg44 = (reg44 & ~(0xff << bit_offset)) |
1859 (sw_dma_modes[wdmamode] << bit_offset);
1860 SetPciConfig4(0x44, reg44);
1861 // 40
1862 GetPciConfig4(0x40, reg40);
1863 reg40 = (reg40 & ~(0xff << bit_offset)) |
1864 (sw_pio_modes[5+i] << bit_offset);
1865 SetPciConfig4(0x40, reg40);
1866 return;
1867 }
1868 }
1869 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1870// SetPciConfig4(0x44, sw_pio_modes[apiomode]);
1871 if(VendorID == ATA_ATI_ID) {
1872 // special case for ATI
1873 // Seems, that PATA ATI are just re-brended ServerWorks
1874 USHORT reg4a;
1875 // 4a
1876 GetPciConfig2(0x4a, reg4a);
1877 reg4a = (reg4a & ~(0xf << (dev*4))) |
1878 (apiomode << (dev*4));
1879 SetPciConfig2(0x4a, reg4a);
1880 }
1881
1882 // 40
1883 GetPciConfig4(0x40, reg40);
1884 reg40 = (reg40 & ~(0xff << bit_offset)) |
1885 (sw_pio_modes[apiomode] << bit_offset);
1886 SetPciConfig4(0x40, reg40);
1887 return;
1888 break; }
1889 case ATA_SILICON_IMAGE_ID: {
1890l_ATA_SILICON_IMAGE_ID:
1891 /********************/
1892 /* SiliconImage/CMD */
1893 /********************/
1894 if(ChipType == SIIMIO) {
1895
1896 static const UCHAR sil_modes[7] =
1897 { 0xf, 0xb, 0x7, 0x5, 0x3, 0x2, 0x1 };
1898 static const USHORT sil_wdma_modes[3] =
1899 { 0x2208, 0x10c2, 0x10c1 };
1900 static const USHORT sil_pio_modes[6] =
1901 { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1, 0x10c1 };
1902
1903 UCHAR ureg = 0xac + ((UCHAR)DeviceNumber * 0x02) + ((UCHAR)Channel * 0x10);
1904 UCHAR uval;
1905 UCHAR mreg = Channel ? 0x84 : 0x80;
1906 UCHAR mask = DeviceNumber ? 0x30 : 0x03;
1907 UCHAR mode;
1908
1909 GetPciConfig1(ureg, uval);
1910 GetPciConfig1(mreg, mode);
1911
1912 /* enable UDMA mode */
1913 for(i = udmamode; i>=0; i--) {
1914
1915 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1916 SetPciConfig1(mreg, mode | mask);
1917 SetPciConfig1(ureg, (uval & 0x3f) | sil_modes[i]);
1918 return;
1919 }
1920 }
1921 /* enable WDMA mode */
1922 for(i = wdmamode; i>=0; i--) {
1923
1924 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1925 SetPciConfig1(mreg, mode | (mask & 0x22));
1926 SetPciConfig2(ureg - 0x4, sil_wdma_modes[i]);
1927 return;
1928 }
1929 }
1930 /* restore PIO mode */
1931 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1932
1933 SetPciConfig1(mreg, mode | (mask & 0x11));
1934 SetPciConfig2(ureg - 0x8, sil_pio_modes[apiomode]);
1935 return;
1936
1937 } else {
1938
1939 static const UCHAR cmd_modes[2][6] = {
1940 { 0x31, 0x21, 0x011, 0x25, 0x15, 0x05 },
1941 { 0xc2, 0x82, 0x042, 0x8a, 0x4a, 0x0a } };
1942 static const UCHAR cmd_wdma_modes[] = { 0x87, 0x32, 0x3f };
1943 static const UCHAR cmd_pio_modes[] = { 0xa9, 0x57, 0x44, 0x32, 0x3f };
1944 ULONG treg = 0x54 + ((dev < 3) ? (dev << 1) : 7);
1945
1946 udmamode = min(udmamode, 5);
1947 /* enable UDMA mode */
1948 for(i = udmamode; i>=0; i--) {
1949 UCHAR umode;
1950
1951 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
1952 GetPciConfig1(Channel ? 0x7b : 0x73, umode);
1953 umode &= ~(!(DeviceNumber & 1) ? 0x35 : 0xca);
1954 umode |= ( cmd_modes[DeviceNumber & 1][i]);
1955 SetPciConfig1(Channel ? 0x7b : 0x73, umode);
1956 return;
1957 }
1958 }
1959 /* make sure eventual UDMA mode from the BIOS is disabled */
1960 ChangePciConfig1(Channel ? 0x7b : 0x73, a & ~(!(DeviceNumber & 1) ? 0x35 : 0xca));
1961
1962 for(i = wdmamode; i>=0; i--) {
1963
1964 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
1965 SetPciConfig1(treg, cmd_wdma_modes[i]);
1966 ChangePciConfig1(Channel ? 0x7b : 0x73, a & ~(!(DeviceNumber & 1) ? 0x35 : 0xca));
1967 return;
1968 }
1969 }
1970 /* set PIO mode timings */
1971 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
1972
1973 SetPciConfig1(treg, cmd_pio_modes[apiomode]);
1974 ChangePciConfig1(Channel ? 0x7b : 0x73, a & ~(!(DeviceNumber & 1) ? 0x35 : 0xca));
1975 return;
1976
1977 }
1978 return;
1979 break; }
1980 case ATA_SIS_ID: {
1981 /*******/
1982 /* SiS */
1983 /*******/
1984 PULONG sis_modes = NULL;
1985 static const ULONG sis_modes_new133[] =
1986 { 0x28269008, 0x0c266008, 0x04263008, 0x0c0a3008, 0x05093008,
1987 0x22196008, 0x0c0a3008, 0x05093008, 0x050939fc, 0x050936ac,
1988 0x0509347c, 0x0509325c, 0x0509323c, 0x0509322c, 0x0509321c};
1989 static const ULONG sis_modes_old133[] =
1990 { 0x00cb, 0x0067, 0x0044, 0x0033, 0x0031, 0x0044, 0x0033, 0x0031,
1991 0x8f31, 0x8a31, 0x8731, 0x8531, 0x8331, 0x8231, 0x8131 };
1992 static const ULONG sis_modes_old[] =
1993 { 0x0c0b, 0x0607, 0x0404, 0x0303, 0x0301, 0x0404, 0x0303, 0x0301,
1994 0xf301, 0xd301, 0xb301, 0xa301, 0x9301, 0x8301 };
1995 static const ULONG sis_modes_new100[] =
1996 { 0x00cb, 0x0067, 0x0044, 0x0033, 0x0031, 0x0044, 0x0033, 0x0031,
1997 0x8b31, 0x8731, 0x8531, 0x8431, 0x8231, 0x8131 };
1998
1999 ULONG reg = 0;
2000 UCHAR reg57;
2001 ULONG reg_size = 0;
2002 ULONG offs;
2003
2004 switch(ChipType) {
2005 case SIS133NEW:
2006 sis_modes = (PULONG)(&sis_modes_new133[0]);
2007 reg_size = 4;
2008 GetPciConfig1(0x57, reg57);
2009 reg = (reg57 & 0x40 ? 0x70 : 0x40) + (dev * 4);
2010 break;
2011 case SIS133OLD:
2012 sis_modes = (PULONG)(&sis_modes_old133[0]);
2013 reg_size = 2;
2014 reg = 0x40 + (dev * 2);
2015 break;
2016 case SIS100NEW:
2017 sis_modes = (PULONG)(&sis_modes_new100[0]);
2018 reg_size = 2;
2019 reg = 0x40 + (dev * 2);
2020 break;
2021 case SIS100OLD:
2022 case SIS66:
2023 case SIS33:
2024 sis_modes = (PULONG)(&sis_modes_old[0]);
2025 reg_size = 2;
2026 reg = 0x40 + (dev * 2);
2027 break;
2028 }
2029
2030 offs = 5+3;
2031 for(i=udmamode; i>=0; i--) {
2032 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
2033 if(reg_size == 4) {
2034 SetPciConfig4(reg, sis_modes[offs+i]);
2035 } else {
2036 SetPciConfig2(reg, (USHORT)sis_modes[offs+i]);
2037 }
2038 return;
2039 }
2040 }
2041
2042 offs = 5;
2043 for(i=wdmamode; i>=0; i--) {
2044 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
2045 if(reg_size == 4) {
2046 SetPciConfig4(reg, sis_modes[offs+i]);
2047 } else {
2048 SetPciConfig2(reg, (USHORT)sis_modes[offs+i]);
2049 }
2050 return;
2051 }
2052 }
2053 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
2054 if(reg_size == 4) {
2055 SetPciConfig4(reg, sis_modes[apiomode]);
2056 } else {
2057 SetPciConfig2(reg, (USHORT)sis_modes[apiomode]);
2058 }
2059 return;
2060 break; }
2061 case 0x16ca:
2062 /* Cenatek Rocket Drive controller */
2063 if (wdmamode >= 0 &&
2066 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + wdmamode);
2067 } else {
2068 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
2069 }
2070 return;
2071 case ATA_ITE_ID: { /* ITE IDE controller */
2072
2073 if(ChipType == ITE_33) {
2074 int a_speed = 3 << (dev * 4);
2075 int u_flag = 1 << dev;
2076 int u_speed = 0;
2077 int pio = 1;
2078 UCHAR reg48, reg4a;
2079 USHORT drive_enables;
2080 ULONG drive_timing;
2081
2082 GetPciConfig1(0x48, reg48);
2083 GetPciConfig1(0x4a, reg4a);
2084
2085 /*
2086 * Setting the DMA cycle time to 2 or 3 PCI clocks (60 and 91 nsec
2087 * at 33 MHz PCI clock) seems to cause BadCRC errors during DMA
2088 * transfers on some drives, even though both numbers meet the minimum
2089 * ATAPI-4 spec of 73 and 54 nsec for UDMA 1 and 2 respectively.
2090 * So the faster times are just commented out here. The good news is
2091 * that the slower cycle time has very little affect on transfer
2092 * performance.
2093 */
2094
2095 for(i=udmamode; i>=0; i--) {
2096 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
2097 SetPciConfig1(0x48, reg48 | u_flag);
2098 reg4a &= ~a_speed;
2099 SetPciConfig1(0x4a, reg4a | u_speed);
2100 pio = 4;
2101 goto setup_drive_ite;
2102 }
2103 }
2104
2105 for(i=wdmamode; i>=0; i--) {
2106 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
2107 SetPciConfig1(0x48, reg48 & ~u_flag);
2108 SetPciConfig1(0x4a, reg4a & ~a_speed);
2109 pio = 3;
2110 return;
2111 }
2112 }
2113 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
2114 SetPciConfig1(0x48, reg48 & ~u_flag);
2115 SetPciConfig1(0x4a, reg4a & ~a_speed);
2116
2117 pio = apiomode;
2118
2119setup_drive_ite:
2120
2121 GetPciConfig2(0x40, drive_enables);
2122 GetPciConfig4(0x44, drive_timing);
2123
2124 /*
2125 * FIX! The DIOR/DIOW pulse width and recovery times in port 0x44
2126 * are being left at the default values of 8 PCI clocks (242 nsec
2127 * for a 33 MHz clock). These can be safely shortened at higher
2128 * PIO modes. The DIOR/DIOW pulse width and recovery times only
2129 * apply to PIO modes, not to the DMA modes.
2130 */
2131
2132 /*
2133 * Enable port 0x44. The IT8172G spec is confused; it calls
2134 * this register the "Slave IDE Timing Register", but in fact,
2135 * it controls timing for both master and slave drives.
2136 */
2137 drive_enables |= 0x4000;
2138
2139 drive_enables &= (0xc000 | (0x06 << (DeviceNumber*4)));
2140 if (pio > 1) {
2141 /* enable prefetch and IORDY sample-point */
2142 drive_enables |= (0x06 << (DeviceNumber*4));
2143 }
2144
2145 SetPciConfig2(0x40, drive_enables);
2146 } else
2147 if(ChipType == ITE_133) {
2148 static const UCHAR udmatiming[] =
2149 { 0x44, 0x42, 0x31, 0x21, 0x11, 0xa2, 0x91 };
2150 static const UCHAR chtiming[] =
2151 { 0xaa, 0xa3, 0xa1, 0x33, 0x31, 0x88, 0x32, 0x31 };
2152 ULONG offset = (Channel<<2) + DeviceNumber;
2153 UCHAR reg54;
2154
2155 for(i=udmamode; i>=0; i--) {
2156 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
2157 ChangePciConfig1(0x50, a & ~(1 << (dev + 3)) );
2158 SetPciConfig1(0x56 + offset, udmatiming[i]);
2159 return;
2160 }
2161 }
2162
2163 for(i=wdmamode; i>=0; i--) {
2164 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
2165
2166 ChangePciConfig1(0x50, a | (1 << (dev + 3)) );
2167 GetPciConfig1(0x54 + offset, reg54);
2168 if(reg54 < chtiming[i+5]) {
2169 SetPciConfig1(0x54 + offset, chtiming[i+5]);
2170 }
2171 return;
2172 }
2173 }
2174 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
2175 ChangePciConfig1(0x50, a | (1 << (dev + 3)) );
2176 GetPciConfig1(0x54 + offset, reg54);
2177 if(reg54 < chtiming[apiomode]) {
2178 SetPciConfig1(0x54 + offset, chtiming[apiomode]);
2179 }
2180 return;
2181 } else
2182 if(ChipType == ITE_133_NEW) {
2183 //static const USHORT reg54_timings[] = { 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x1001, 0x1001 };
2184 static const UCHAR udmatiming[] =
2185 { 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10 };
2186 static const UCHAR timings[] =
2187 { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23,
2188 0x23, 0x23, 0x23, 0x23, 0x23, 0x02, 0x02 };
2189 BOOLEAN udma_ok = FALSE;
2190 BOOLEAN ok = FALSE;
2191 UCHAR timing = 0;
2192
2193 WCHAR reg40;
2194 UCHAR reg44;
2195 USHORT reg4a;
2196 USHORT reg54;
2197 USHORT mask40=0, new40=0;
2198 UCHAR mask44=0, new44=0;
2199
2200 GetPciConfig2(0x40, reg40);
2201 GetPciConfig1(0x44, reg44);
2202 GetPciConfig2(0x4a, reg4a);
2203 GetPciConfig2(0x54, reg54);
2204
2205 if(!(reg54 & (0x10 << dev))) {
2206 // 80-pin check
2207 udmamode = min(udmamode, 2);
2208 }
2209
2210 for(i=udmamode; i>=0; i--) {
2211 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
2212 ChangePciConfig1(0x48, a | (1 << dev) );
2213 ChangePciConfig2(0x4a,
2214 (a & ~(0x3 << (dev*4))) |
2215 (udmatiming[i] << (dev*4)) );
2216 ok=TRUE;
2217 udma_ok=TRUE;
2218 timing = timings[i+8];
2219 break;
2220 }
2221 }
2222
2223 for(i=wdmamode; !ok && i>=0; i--) {
2224 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
2225
2226 ok=TRUE;
2227 timing = timings[i+5];
2228 break;
2229 }
2230 }
2231
2232 if(!ok) {
2233 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
2234 timing = timings[apiomode];
2235 }
2236
2237 if(!udma_ok) {
2238 ChangePciConfig1(0x48, a & ~(1 << dev) );
2239 ChangePciConfig2(0x4a, a & ~(0x3 << (dev << 2)) );
2240 }
2241 if (udma_ok && udmamode >= ATA_UDMA2) {
2242 reg54 |= (0x1 << dev);
2243 } else {
2244 reg54 &= ~(0x1 << dev);
2245 }
2246 if (udma_ok && udmamode >= ATA_UDMA5) {
2247 reg54 |= (0x1000 << dev);
2248 } else {
2249 reg54 &= ~(0x1000 << dev);
2250 }
2251 SetPciConfig2(0x54, reg54 );
2252
2253 reg40 &= 0xff00;
2254 reg40 |= 0x4033;
2255
2256 if(!(DeviceNumber & 1)) {
2257 reg40 |= (isAtapi ? 0x04 : 0x00);
2258 mask40 = 0x3300;
2259 new40 = timing << 8;
2260 } else {
2261 reg40 |= (isAtapi ? 0x40 : 0x00);
2262 mask44 = 0x0f;
2263 new44 = ((timing & 0x30) >> 2) |
2264 (timing & 0x03);
2265 }
2266 SetPciConfig2(0x40, (reg40 & ~mask40) | new40);
2267 SetPciConfig1(0x44, (reg44 & ~mask44) | new44);
2268 return;
2269 }
2270
2271 return;
2272 break; }
2273 case 0x3388:
2274 /* HiNT Corp. VXPro II EIDE */
2275 if (wdmamode >= 0 &&
2278 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_DMA);
2279 } else {
2280 AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode);
2281 }
2282 return;
2283 case ATA_JMICRON_ID: {
2284
2285 UCHAR reg40;
2286 GetPciConfig1(0x40, reg40);
2287
2288 /*
2289 This is done on chip-init phase
2290 if(reg40 & 0x08) {
2291 // 80-pin check
2292 udmamode = min(udmamode, 2);
2293 }
2294 */
2295 /* Nothing to do to setup mode, the controller snoop SET_FEATURE cmd. */
2296 if(apiomode >= 4)
2297 apiomode = 4;
2298 for(i=udmamode; i>=0; i--) {
2299 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_UDMA0 + i)) {
2300 return;
2301 }
2302 }
2303 for(i=wdmamode; i>=0; i--) {
2304 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_WDMA0 + i)) {
2305 return;
2306 }
2307 }
2308 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode)) {
2309 return;
2310 }
2311 return;
2312 break; }
2313 }
2314
2315try_generic_dma:
2316
2317 /* unknown controller chip */
2318
2319 /* better not try generic DMA on ATAPI devices it almost never works */
2320 if (isAtapi) {
2321 KdPrint2((PRINT_PREFIX "ATAPI on unknown controller -> PIO\n"));
2322 udmamode =
2323 wdmamode = -1;
2324 }
2325
2326 /* if controller says its setup for DMA take the easy way out */
2327 /* the downside is we dont know what DMA mode we are in */
2328 if ((udmamode >= 0 || /*wdmamode > 1*/ wdmamode >= 0) &&
2329 /*deviceExtension->BaseIoAddressBM[lChannel]*/ (deviceExtension->BusMaster==DMA_MODE_BM) &&
2330 (GetDmaStatus(deviceExtension, lChannel) &
2331 (!(DeviceNumber & 1) ?
2333// LunExt->TransferMode = ATA_DMA;
2334// return;
2335 KdPrint2((PRINT_PREFIX "try DMA on unknown controller\n"));
2336 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_DMA)) {
2337 return;
2338 }
2339 }
2340
2341#if 0
2342 /* well, we have no support for this, but try anyways */
2343 if ((wdmamode >= 0 && apiomode >= 4) && deviceExtension->BaseIoAddressBM[lChannel]) {
2344 if(AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_DMA/* + wdmamode*/)) {
2345 return;
2346 }
2347 }
2348#endif
2349
2350 KdPrint2((PRINT_PREFIX "try PIO%d on unknown controller\n", apiomode));
2351 if(!AtaSetTransferMode(deviceExtension, DeviceNumber, lChannel, LunExt, ATA_PIO0 + apiomode)) {
2352 KdPrint2((PRINT_PREFIX "fall to PIO on unknown controller\n"));
2353 LunExt->TransferMode = ATA_PIO;
2354 }
2355 return;
2356} // end AtapiDmaInit()
static const unsigned char reg_size[]
Definition: amd64_sup.c:21
#define IDE_STATUS_ERROR
Definition: atapi.h:125
#define GetStatus(BaseIoAddress, Status)
Definition: atapi.h:328
#define IDE_STATUS_IDLE
Definition: atapi.h:131
#define ok(value,...)
Definition: atltest.h:57
#define CYRIX_35
Definition: bm_devs_decl.h:720
#define ATPOLD
Definition: bm_devs_decl.h:634
#define ALIOLD
Definition: bm_devs_decl.h:636
#define ATA_ACARD_ID
Definition: bm_devs_decl.h:111
#define ICH4_FIX
Definition: bm_devs_decl.h:690
#define ATA_ISCH
Definition: bm_devs_decl.h:311
#define CYRIX_3x
Definition: bm_devs_decl.h:718
#define ATA_NETCELL_ID
Definition: bm_devs_decl.h:352
#define ATA_I82371FB
Definition: bm_devs_decl.h:186
#define ATA_MARVELL_ID
Definition: bm_devs_decl.h:327
#define ATA_CYPRESS_ID
Definition: bm_devs_decl.h:171
#define ATA_NATIONAL_ID
Definition: bm_devs_decl.h:349
#define SetPciConfig4(offs, op)
Definition: bsmaster.h:1688
#define BM_STATUS_DRIVE_0_DMA
Definition: bsmaster.h:146
#define BM_STATUS_DRIVE_1_DMA
Definition: bsmaster.h:147
#define GetDmaStatus(de, c)
Definition: bsmaster.h:1711
#define DMA_MODE_BM
Definition: bsmaster.h:1707
void SelectDrive(WCHAR &Drive)
unsigned int idx
Definition: utils.c:41
GLintptr offset
Definition: glext.h:5920
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum mode
Definition: glext.h:6217
static int reg
Definition: i386-dis.c:1290
VOID NTAPI hpt_timing(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG dev, IN CHAR mode)
Definition: id_dma.cpp:2536
VOID NTAPI via82c_timing(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG dev, IN CHAR mode)
Definition: id_dma.cpp:2681
BOOLEAN NTAPI AtaSetTransferMode(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG DeviceNumber, IN ULONG lChannel, IN PHW_LU_EXTENSION LunExt, IN ULONG mode)
Definition: id_dma.cpp:892
VOID NTAPI promise_timing(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG dev, IN CHAR mode)
Definition: id_dma.cpp:2391
__inline BOOLEAN UniataIsSATARangeAvailable(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG lChannel)
Definition: id_sata.h:91
ULONG last_cdev
Definition: bsmaster.h:1023
UCHAR TransferMode
Definition: bsmaster.h:1171
IDENTIFY_DATA2 IdentifyData
Definition: bsmaster.h:1162
UCHAR LimitedTransferMode
Definition: bsmaster.h:1172
UCHAR OrigTransferMode
Definition: bsmaster.h:1173
Definition: dialog.c:52
uint32_t * PULONG
Definition: typedefs.h:59
#define IDENTIFY_CABLE_ID_VALID
Definition: atapi.h:844
#define ATA_WDMA0
Definition: atapi.h:323
#define ATA_DMA
Definition: atapi.h:316
#define ATA_PIO4
Definition: atapi.h:313
#define ATAPI_DEVICE(chan, dev)
Definition: atapi.h:1624
#define ATA_WDMA2
Definition: atapi.h:325
UCHAR DDKFASTAPI UniataIsIdle(IN struct _HW_DEVICE_EXTENSION *deviceExtension, IN UCHAR Status)
Definition: id_ata.cpp:742
#define ATA_UDMA3
Definition: atapi.h:331
#define ATA_WDMA
Definition: atapi.h:322
#define ATA_PIO
Definition: atapi.h:306
#define ATA_UDMA
Definition: atapi.h:327
#define ATA_UDMA0
Definition: atapi.h:328
__inline BOOLEAN ata_is_sata(PIDENTIFY_DATA ident)
Definition: atapi.h:1636
#define ATA_PIO0
Definition: atapi.h:309
#define ATA_PIO3
Definition: atapi.h:312
static int timing
Definition: xmllint.c:163
__wchar_t WCHAR
Definition: xmlstorage.h:180
char CHAR
Definition: xmlstorage.h:175

Referenced by AtapiDmaInit__(), and AtapiDmaReinit().

◆ AtapiDmaInit__()

VOID NTAPI AtapiDmaInit__ ( IN PHW_DEVICE_EXTENSION  deviceExtension,
IN PHW_LU_EXTENSION  LunExt 
)

Definition at line 857 of file id_dma.cpp.

861{
862 if(LunExt->IdentifyData.SupportDma ||
863 (LunExt->IdentifyData.AtapiDMA.DMASupport && (LunExt->DeviceFlags & DFLAGS_ATAPI_DEVICE))) {
865 "AtapiDmaInit__: Set (U)DMA on Device %d\n", LunExt->Lun));
866/* for(i=AtaUmode(&(LunExt->IdentifyData)); i>=0; i--) {
867 AtapiDmaInit(deviceExtension, ldev & 1, ldev >> 1,
868 (CHAR)AtaPioMode(&(LunExt->IdentifyData)),
869 (CHAR)AtaWmode(&(LunExt->IdentifyData)),
870 UDMA_MODE0+(CHAR)i );
871 }
872 for(i=AtaWmode(&(LunExt->IdentifyData)); i>=0; i--) {
873 AtapiDmaInit(deviceExtension, ldev & 1, ldev >> 1,
874 (CHAR)AtaPioMode(&(LunExt->IdentifyData)),
875 (CHAR)AtaWmode(&(LunExt->IdentifyData)),
876 UDMA_MODE0+(CHAR)i );
877 }*/
878 AtapiDmaInit(deviceExtension, LunExt->Lun, LunExt->chan->lChannel,
879 (CHAR)AtaPioMode(&(LunExt->IdentifyData)),
880 (CHAR)AtaWmode(&(LunExt->IdentifyData)),
881 (CHAR)AtaUmode(&(LunExt->IdentifyData)) );
882 } else {
884 "AtapiDmaInit__: Set PIO on Device %d\n", LunExt->Lun));
885 AtapiDmaInit(deviceExtension, LunExt->Lun, LunExt->chan->lChannel,
886 (CHAR)AtaPioMode(&(LunExt->IdentifyData)), -1, -1);
887 }
888} // end AtapiDmaInit__()
#define DFLAGS_ATAPI_DEVICE
Definition: atapi.h:41
VOID NTAPI AtapiDmaInit(IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG lChannel, IN SCHAR apiomode, IN SCHAR wdmamode, IN SCHAR udmamode)
Definition: id_dma.cpp:975
LONG NTAPI AtaWmode(PIDENTIFY_DATA2 ident)
Definition: id_ata.cpp:1241
LONG NTAPI AtaPioMode(PIDENTIFY_DATA2 ident)
Definition: id_ata.cpp:1220
LONG NTAPI AtaUmode(PIDENTIFY_DATA2 ident)
Definition: id_ata.cpp:1254

Referenced by AtapiDmaReinit(), AtapiHwInitialize__(), and AtapiStartIo__().

◆ AtapiDmaPioSync()

BOOLEAN NTAPI AtapiDmaPioSync ( PVOID  HwDeviceExtension,
PSCSI_REQUEST_BLOCK  Srb,
PUCHAR  data,
ULONG  count 
)

Definition at line 467 of file id_dma.cpp.

473{
474#ifndef USE_OWN_DMA
475 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
476 ULONG dma_base;
478 ULONG dma_count;
479 ULONG len;
480 PATA_REQ AtaReq;
481
482 // This must never be called after DMA operation !!!
483 KdPrint2((PRINT_PREFIX "AtapiDmaPioSync: data %#x, len %#x\n", data, count));
484
485 if(!Srb) {
486 KdPrint2((PRINT_PREFIX "AtapiDmaPioSync: !Srb\n" ));
487 return FALSE;
488 }
489
490 AtaReq = (PATA_REQ)(Srb->SrbExtension);
491
492 // do nothing on PCI (This can be changed. We cannot guarantee,
493 // that CommonBuffer will always point to User's buffer,
494 // however, this usually happens on PCI-32)
495 if(deviceExtension->OrigAdapterInterfaceType == PCIBus) {
496 return TRUE;
497 }
498 // do nothing for DMA
499 if(AtaReq->Flags & REQ_FLAG_DMA_OPERATION) {
500 return TRUE;
501 }
502
503 if(!data) {
504 KdPrint2((PRINT_PREFIX "AtapiDmaPioSync: !data\n" ));
505 return FALSE;
506 }
507
508 while(count) {
509 dma_base = AtapiVirtToPhysAddr(HwDeviceExtension, Srb, data, &dma_count);
510 if(!dma_base) {
511 KdPrint2((PRINT_PREFIX "AtapiDmaPioSync: !dma_base for data %#x\n", data));
512 return FALSE;
513 }
514 DmaBuffer = (PUCHAR)ScsiPortGetVirtualAddress(HwDeviceExtension,
516 if(!DmaBuffer) {
517 KdPrint2((PRINT_PREFIX "AtapiDmaPioSync: !DmaBuffer for dma_base %#x\n", dma_base));
518 return FALSE;
519 }
520 len = min(dma_count, count);
522 count -= len;
523 data += len;
524 }
525#endif //USE_OWN_DMA
526
527 return TRUE;
528} // end AtapiDmaPioSync()
SCSI_PHYSICAL_ADDRESS NTAPI ScsiPortConvertUlongToPhysicalAddress(IN ULONG_PTR UlongAddress)
Definition: scsiport.c:533
PVOID NTAPI ScsiPortGetVirtualAddress(IN PVOID HwDeviceExtension, IN SCSI_PHYSICAL_ADDRESS PhysicalAddress)
Definition: scsiport.c:825
#define REQ_FLAG_DMA_OPERATION
Definition: bsmaster.h:932
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum GLsizei len
Definition: glext.h:6722
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
@ PCIBus
Definition: restypes.h:126
@ DmaBuffer
Definition: strmini.h:276
INTERFACE_TYPE OrigAdapterInterfaceType
Definition: bsmaster.h:1315

Referenced by AtapiInterrupt__().

◆ AtapiDmaReinit()

VOID NTAPI AtapiDmaReinit ( IN PHW_DEVICE_EXTENSION  deviceExtension,
IN PHW_LU_EXTENSION  LunExt,
IN PATA_REQ  AtaReq 
)

(LunExt->DeviceFlags & DFLAGS_FORCE_DOWNRATE) &&

Definition at line 754 of file id_dma.cpp.

759{
760 SCHAR apiomode;
761
762 if((deviceExtension->HwFlags & UNIATA_AHCI) &&
763 !(LunExt->DeviceFlags & DFLAGS_ATAPI_DEVICE)) {
764 // skip unnecessary checks
765 KdPrint2((PRINT_PREFIX "AtapiDmaReinit: ahci, nothing to do for HDD\n"));
766 return;
767 }
768
769 apiomode = (CHAR)AtaPioMode(&(LunExt->IdentifyData));
770
771 if(!(AtaReq->Flags & REQ_FLAG_DMA_OPERATION)) {
773 "AtapiDmaReinit: !(AtaReq->Flags & REQ_FLAG_DMA_OPERATION), fall to PIO on Device %d\n", LunExt->Lun));
774 goto limit_pio;
775 }
776 if(deviceExtension->HwFlags & UNIATA_AHCI) {
777 if(!AtaReq->ahci.ahci_base64) {
779 "AtapiDmaReinit: no AHCI PRD, fatal on Device %d\n", LunExt->Lun));
780 goto exit;
781 }
782 } else
783 if(!AtaReq->ata.dma_base) {
785 "AtapiDmaReinit: no PRD, fall to PIO on Device %d\n", LunExt->Lun));
786 goto limit_pio;
787 }
788
789 if((deviceExtension->HbaCtrlFlags & HBAFLAGS_DMA_DISABLED_LBA48) &&
790 (AtaReq->lba >= (LONGLONG)ATA_MAX_LBA28) &&
791 (LunExt->TransferMode > ATA_PIO5) ) {
793 "AtapiDmaReinit: FORCE_DOWNRATE on Device %d for LBA48\n", LunExt->Lun));
794 goto limit_lba48;
795 }
796
797
798 if(AtaReq->Flags & REQ_FLAG_FORCE_DOWNRATE) {
800 "AtapiDmaReinit: FORCE_DOWNRATE on Device %d\n", LunExt->Lun));
801 if(AtaReq->lba >= (LONGLONG)ATA_MAX_LBA28) {
802limit_lba48:
803 LunExt->DeviceFlags |= REQ_FLAG_FORCE_DOWNRATE_LBA48;
804limit_pio:
805 // do not make extra work if we already use PIO
806 if(/*LunExt->TransferMode >= ATA_DMA*/
807 (LunExt->TransferMode > ATA_PIO5) && (LunExt->TransferMode != ATA_PIO0+apiomode)
808 ) {
810 "AtapiDmaReinit: set PIO mode on Device %d (%x -> %x)\n", LunExt->Lun, LunExt->TransferMode, ATA_PIO0+apiomode));
811 AtapiDmaInit(deviceExtension, LunExt->Lun, LunExt->chan->lChannel,
812 apiomode,
813 -1,
814 -1 );
815 } else
816 if(LunExt->LimitedTransferMode < LunExt->TransferMode) {
818 "AtapiDmaReinit: set PIO mode on Device %d (%x -> %x) (2)\n", LunExt->Lun, LunExt->TransferMode, LunExt->LimitedTransferMode));
819 AtapiDmaInit(deviceExtension, LunExt->Lun, LunExt->chan->lChannel,
820 LunExt->LimitedTransferMode-ATA_PIO0,
821 -1,
822 -1 );
823 }
824
825 } else {
827 "AtapiDmaReinit: set MAX mode on Device %d\n", LunExt->Lun));
828 AtapiDmaInit(deviceExtension, LunExt->Lun, LunExt->chan->lChannel,
829 apiomode,
830 min( retry_Wdma[AtaReq->retry],
831 (CHAR)AtaWmode(&(LunExt->IdentifyData)) ),
832 min( retry_Udma[AtaReq->retry],
833 (CHAR)AtaUmode(&(LunExt->IdentifyData)) ) );
834 }
835// LunExt->DeviceFlags &= ~DFLAGS_FORCE_DOWNRATE;
836 } else
837 if(
838 (LunExt->LimitedTransferMode >
839 LunExt->TransferMode) ||
840 (LunExt->DeviceFlags & DFLAGS_REINIT_DMA) ||
841 ((deviceExtension->HwFlags & UNIATA_CHAN_TIMINGS) && ((ULONG)LunExt->Lun != LunExt->chan->last_cdev))) {
842 // restore IO mode
844 "AtapiDmaReinit: restore IO mode on Device %d, last dev %d\n", LunExt->Lun, LunExt->chan->last_cdev));
845 AtapiDmaInit__(deviceExtension, LunExt);
846 } else {
848 "AtapiDmaReinit: LimitedTransferMode == TransferMode = %x (%x), Device %d, last dev %d\n", LunExt->TransferMode, LunExt->DeviceFlags, LunExt->Lun, LunExt->chan->last_cdev));
849 }
850
851exit:
852 return;
853} // end AtapiDmaReinit()
#define CHAR(Char)
#define UNIATA_CHAN_TIMINGS
Definition: bm_devs_decl.h:631
#define REQ_FLAG_FORCE_DOWNRATE
Definition: bsmaster.h:931
#define ATA_MAX_LBA28
Definition: bsmaster.h:95
#define REQ_FLAG_FORCE_DOWNRATE_LBA48
Definition: bsmaster.h:937
#define HBAFLAGS_DMA_DISABLED_LBA48
Definition: bsmaster.h:1359
VOID NTAPI AtapiDmaInit__(IN PHW_DEVICE_EXTENSION deviceExtension, IN PHW_LU_EXTENSION LunExt)
Definition: id_dma.cpp:857
static const CHAR retry_Udma[MAX_RETRIES+1]
Definition: id_dma.cpp:54
static const CHAR retry_Wdma[MAX_RETRIES+1]
Definition: id_dma.cpp:53
#define exit(n)
Definition: config.h:202
signed char SCHAR
Definition: sqltypes.h:14
int64_t LONGLONG
Definition: typedefs.h:68
#define ATA_PIO5
Definition: atapi.h:314
#define DFLAGS_REINIT_DMA
Definition: atapi.h:252

Referenced by AtapiSendCommand(), and IdeReadWrite().

◆ AtapiDmaSetup()

BOOLEAN NTAPI AtapiDmaSetup ( IN PVOID  HwDeviceExtension,
IN ULONG  DeviceNumber,
IN ULONG  lChannel,
IN PSCSI_REQUEST_BLOCK  Srb,
IN PUCHAR  data,
IN ULONG  count 
)

Definition at line 247 of file id_dma.cpp.

255{
256 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
257 ULONG dma_count, dma_base, dma_baseu;
258 ULONG dma_count0, dma_base0;
259 ULONG i;
260 PHW_CHANNEL chan = &(deviceExtension->chan[lChannel]);
261 PATA_REQ AtaReq = (PATA_REQ)(Srb->SrbExtension);
262 BOOLEAN use_DB_IO = FALSE;
263 BOOLEAN use_AHCI = (deviceExtension->HwFlags & UNIATA_AHCI) ? TRUE : FALSE;
264 ULONG orig_count = count;
265 ULONG max_entries = use_AHCI ? ATA_AHCI_DMA_ENTRIES : ATA_DMA_ENTRIES;
266 //ULONG max_frag = use_AHCI ? (0x3fffff+1) : (4096); // DEBUG, replace 4096 for proper chipset-specific value
267 ULONG max_frag = deviceExtension->DmaSegmentLength;
268 ULONG seg_align = deviceExtension->DmaSegmentAlignmentMask;
269
270 if(AtaReq->dma_entries) {
271 AtaReq->Flags |= REQ_FLAG_DMA_OPERATION;
272 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: already setup, %d entries\n", AtaReq->dma_entries));
273 return TRUE;
274 }
275 AtaReq->ata.dma_base = 0;
276 AtaReq->Flags &= ~REQ_FLAG_DMA_OPERATION;
277
278 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: mode %#x, data %x, count %x, lCh %x, dev %x\n",
279 chan->lun[DeviceNumber]->TransferMode,
280 data, count, lChannel, DeviceNumber ));
281 if(chan->lun[DeviceNumber]->TransferMode < ATA_DMA) {
282 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: Not DMA mode, assume this is just preparation\n" ));
283 //return FALSE;
284 }
285 //KdPrint2((PRINT_PREFIX " checkpoint 1\n" ));
286 if(!count) {
287 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: count=0\n" ));
288 return FALSE;
289 }
290 //KdPrint2((PRINT_PREFIX " checkpoint 2\n" ));
291 if(count > deviceExtension->MaximumDmaTransferLength) {
292 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: deviceExtension->MaximumDmaTransferLength > count\n" ));
293 return FALSE;
294 }
295 //KdPrint2((PRINT_PREFIX " checkpoint 3\n" ));
296 if((ULONG_PTR)data & deviceExtension->AlignmentMask) {
297 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: unaligned data: %#x (%#x)\n", data, deviceExtension->AlignmentMask));
298 return FALSE;
299 }
300
301 //KdPrint2((PRINT_PREFIX " checkpoint 4\n" ));
302 if(use_AHCI) {
303 KdPrint2((PRINT_PREFIX " get Phys(AHCI_CMD=%x)\n", AtaReq->ahci.ahci_cmd_ptr ));
304 dma_base = AtapiVirtToPhysAddr(HwDeviceExtension, NULL, (PUCHAR)(AtaReq->ahci.ahci_cmd_ptr), &i, &dma_baseu);
305 AtaReq->ahci.ahci_base64 = 0; // clear before setup
306 } else {
307 KdPrint2((PRINT_PREFIX " get Phys(PRD=%x)\n", &(AtaReq->dma_tab) ));
308 dma_base = AtapiVirtToPhysAddr(HwDeviceExtension, NULL, (PUCHAR)&(AtaReq->dma_tab) /*chan->dma_tab*/, &i, &dma_baseu);
309 }
310 if(dma_baseu && i) {
311 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: SRB built-in PRD above 4Gb: %8.8x%8.8x\n", dma_baseu, dma_base));
312 if(!deviceExtension->Host64) {
313 dma_base = chan->DB_PRD_PhAddr;
314 AtaReq->Flags |= REQ_FLAG_DMA_DBUF_PRD;
315 i = 1;
316 }
317 } else
318 if(!dma_base || !i || ((LONG)(dma_base) == -1)) {
319 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: No BASE\n" ));
320 return FALSE;
321 }
322 AtaReq->ata.dma_base = dma_base; // aliased to AtaReq->ahci.ahci_base64
323
324 KdPrint2((PRINT_PREFIX " get Phys(data[0]=%x)\n", data ));
325 dma_base = AtapiVirtToPhysAddr(HwDeviceExtension, Srb, data, &dma_count, &dma_baseu);
326 if(dma_baseu && dma_count) {
327 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: 1st block of buffer above 4Gb: %8.8x%8.8x cnt=%x\n", dma_baseu, dma_base, dma_count));
328 if(!deviceExtension->Host64) {
329retry_DB_IO:
330 use_DB_IO = TRUE;
331 dma_base = chan->DB_IO_PhAddr;
332 data = (PUCHAR)(chan->DB_IO);
333 } else {
334 AtaReq->ahci.ahci_base64 = (ULONGLONG)dma_base | ((ULONGLONG)dma_baseu << 32);
335 }
336 } else
337 if(!dma_count || ((LONG)(dma_base) == -1)) {
338 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: No 1st block\n" ));
339 //AtaReq->dma_base = NULL;
340 AtaReq->ahci.ahci_base64 = NULL;
341 return FALSE;
342 }
343
344 dma_count = min(count, (PAGE_SIZE - ((ULONG_PTR)data & PAGE_MASK)));
345 data += dma_count;
346 count -= dma_count;
347 i = 0;
348
349 dma_count0 = dma_count;
350 dma_base0 = dma_base;
351
352 while (count) {
353/* KdPrint2((PRINT_PREFIX " segments %#x+%#x == %#x && %#x+%#x <= %#x\n",
354 dma_base0, dma_count0, dma_base,
355 dma_count0, dma_count, max_frag));*/
356 if(dma_base0+dma_count0 == dma_base &&
357 dma_count0+dma_count <= max_frag) {
358 // 'i' should be always > 0 here
359 // for BM we cannot cross 64k boundary
360 if(dma_base & seg_align) {
361 //KdPrint2((PRINT_PREFIX " merge segments\n" ));
362 ASSERT(i);
363 //BrutePoint();
364 i--;
365 dma_base = dma_base0;
366 dma_count += dma_count0;
367 }
368 }
369 if(use_AHCI) {
370 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].base = dma_base;
371 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].baseu = dma_baseu;
372 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved1 = 0;
373 *((PULONG)&(AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].DBC_ULONG)) = ((dma_count-1) & 0x3fffff);
374/* AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved2 = 0;
375 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].I = 0;*/
376 KdPrint2((PRINT_PREFIX " ph data[%d]=%x:%x (%x)\n", i, dma_baseu, dma_base, AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].DBC));
377 } else {
378 AtaReq->dma_tab[i].base = dma_base;
379 AtaReq->dma_tab[i].count = (dma_count & 0xffff);
380 }
381 dma_count0 = dma_count;
382 dma_base0 = dma_base;
383 i++;
384 if (i >= max_entries) {
385 KdPrint2((PRINT_PREFIX "too many segments in DMA table\n" ));
386 //AtaReq->dma_base = NULL;
387 AtaReq->ahci.ahci_base64 = NULL;
388 return FALSE;
389 }
390 KdPrint2((PRINT_PREFIX " get Phys(data[n=%d+%x]=%x)\n", i, dma_count0, data ));
391 dma_base = AtapiVirtToPhysAddr(HwDeviceExtension, Srb, data, &dma_count, &dma_baseu);
392 if(dma_baseu && dma_count) {
393 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: block of buffer above 4Gb: %8.8x%8.8x, cnt=%x\n", dma_baseu, dma_base, dma_count));
394 if(!deviceExtension->Host64) {
395 if(use_DB_IO) {
396 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: *ERROR* special buffer above 4Gb: %8.8x%8.8x\n", dma_baseu, dma_base));
397 return FALSE;
398 }
399 count = orig_count;
400 goto retry_DB_IO;
401 }
402 } else
403 if(!dma_count || !dma_base || ((LONG)(dma_base) == -1)) {
404 //AtaReq->dma_base = NULL;
405 AtaReq->ahci.ahci_base64 = 0;
406 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: No NEXT block\n" ));
407 return FALSE;
408 }
409
410 dma_count = min(count, PAGE_SIZE);
411 data += min(count, PAGE_SIZE);
413 }
414 KdPrint2((PRINT_PREFIX " set TERM\n" ));
415/* KdPrint2((PRINT_PREFIX " segments %#x+%#x == %#x && #x+%#x <= %#x\n",
416 dma_base0, dma_count0, dma_base,
417 dma_count0, dma_count, max_frag));*/
418 if(dma_base0+dma_count0 == dma_base &&
419 dma_count0+dma_count <= max_frag) {
420 // 'i' should be always > 0 here
421 if(dma_base & seg_align) {
422 //KdPrint2((PRINT_PREFIX " merge segments\n" ));
423 //BrutePoint();
424 ASSERT(i);
425 i--;
426 dma_base = dma_base0;
427 dma_count += dma_count0;
428 }
429 }
430 if(use_AHCI) {
431 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].base = dma_base;
432 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].baseu = dma_baseu;
433 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved1 = 0;
434 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].DBC = ((dma_count-1) & 0x3fffff);
435 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved2 = 0;
436 *((PULONG)&(AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].DBC_ULONG)) = ((dma_count-1) & 0x3fffff);
437 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].I = 1; // interrupt when ready
438 KdPrint2((PRINT_PREFIX " ph data[%d]=%x:%x (%x)\n", i, dma_baseu, dma_base, AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].DBC));
439 if(((ULONG_PTR)&(AtaReq->ahci.ahci_cmd_ptr->prd_tab) & ~PAGE_MASK) != ((ULONG_PTR)&(AtaReq->ahci.ahci_cmd_ptr->prd_tab[i]) & ~PAGE_MASK)) {
440 KdPrint2((PRINT_PREFIX "PRD table crosses page boundary! %x vs %x\n",
441 &AtaReq->ahci.ahci_cmd_ptr->prd_tab, &(AtaReq->ahci.ahci_cmd_ptr->prd_tab[i]) ));
442 //AtaReq->Flags |= REQ_FLAG_DMA_DBUF_PRD;
443 }
444 } else {
445 AtaReq->dma_tab[i].base = dma_base;
446 AtaReq->dma_tab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT;
447 if(((ULONG_PTR)&(AtaReq->dma_tab) & ~PAGE_MASK) != ((ULONG_PTR)&(AtaReq->dma_tab[i]) & ~PAGE_MASK)) {
448 KdPrint2((PRINT_PREFIX "DMA table crosses page boundary! %x vs %x\n",
449 &AtaReq->dma_tab, &(AtaReq->dma_tab[i]) ));
450 //AtaReq->Flags |= REQ_FLAG_DMA_DBUF_PRD;
451 }
452 }
453 AtaReq->dma_entries = i+1;
454
455 if(use_DB_IO) {
456 AtaReq->Flags |= REQ_FLAG_DMA_DBUF;
457 }
458 AtaReq->Flags |= REQ_FLAG_DMA_OPERATION;
459
460 KdPrint2((PRINT_PREFIX "AtapiDmaSetup: OK\n" ));
461 return TRUE;
462
463} // end AtapiDmaSetup()
#define ATA_DMA_EOT
Definition: bsmaster.h:101
#define ATA_AHCI_DMA_ENTRIES
Definition: bsmaster.h:749
#define ATA_DMA_ENTRIES
Definition: bsmaster.h:100
#define ULONG_PTR
Definition: config.h:101
#define PAGE_MASK
Definition: tools.h:88
#define PAGE_SIZE
Definition: env_spec_w32.h:49
ULONG count
Definition: bsmaster.h:131
ULONG base
Definition: bsmaster.h:130
ULONG DmaSegmentAlignmentMask
Definition: bsmaster.h:1320
uint32_t ULONG_PTR
Definition: typedefs.h:65
ULONG dma_entries
Definition: bsmaster.h:897

Referenced by AtapiSendCommand(), IdeReadWrite(), IdeSendCommand(), UniataAhciSendPIOCommand(), and UniataAhciSendPIOCommandDirect().

◆ AtapiDmaStart()

VOID NTAPI AtapiDmaStart ( IN PVOID  HwDeviceExtension,
IN ULONG  DeviceNumber,
IN ULONG  lChannel,
IN PSCSI_REQUEST_BLOCK  Srb 
)

Definition at line 588 of file id_dma.cpp.

594{
595 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
596 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM = deviceExtension->BaseIoAddressBM[lChannel];
597 PATA_REQ AtaReq = (PATA_REQ)(Srb->SrbExtension);
598 PHW_CHANNEL chan = &deviceExtension->chan[lChannel];
599
600 ULONG VendorID = deviceExtension->DevID & 0xffff;
601 ULONG ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK;
602// UCHAR statusByte2;
603/*
604 GetStatus(chan, statusByte2);
605 KdPrint2((PRINT_PREFIX "AtapiDmaStart: %s on %#x:%#x\n",
606 (Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? "read" : "write",
607 lChannel, DeviceNumber ));
608*/
609 if(!AtaReq->ata.dma_base) {
610 KdPrint2((PRINT_PREFIX "AtapiDmaStart: *** !AtaReq->ata.dma_base\n"));
611 return;
612 }
613 KdPrint2((PRINT_PREFIX "AtapiDmaStart: lchan=%d\n", lChannel));
614
615/*
616// GetStatus(chan, statusByte2);
617 if(AtaReq->Flags & REQ_FLAG_DMA_DBUF_PRD) {
618 KdPrint2((PRINT_PREFIX " DBUF_PRD\n"));
619 ASSERT(FALSE);
620 if(deviceExtension->HwFlags & UNIATA_AHCI) {
621 RtlCopyMemory(chan->DB_PRD, AtaReq->ahci.ahci_cmd_ptr, sizeof(AtaReq->ahci_cmd0));
622 } else {
623 RtlCopyMemory(chan->DB_PRD, &(AtaReq->dma_tab), sizeof(AtaReq->dma_tab));
624 }
625 }
626 if(!(Srb->SrbFlags & SRB_FLAGS_DATA_IN) &&
627 (AtaReq->Flags & REQ_FLAG_DMA_DBUF)) {
628 KdPrint2((PRINT_PREFIX " DBUF (Write)\n"));
629 ASSERT(FALSE);
630 RtlCopyMemory(chan->DB_IO, AtaReq->DataBuffer,
631 Srb->DataTransferLength);
632 }
633*/
634 // set flag
636
637 switch(VendorID) {
638 case ATA_PROMISE_ID:
639 if(ChipType == PRNEW) {
640 ULONG Channel = deviceExtension->Channel + lChannel;
641
642 if(chan->ChannelCtrlFlags & CTRFLAGS_LBA48) {
643 AtapiWritePortEx4(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),(Channel ? 0x24 : 0x20),
644 ((Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? 0x05000000 : 0x06000000) | (Srb->DataTransferLength >> 1)
645 );
646 }
647/*
648 } else
649 if(deviceExtension->MemIo) {
650 // begin transaction
651 AtapiWritePort4(chan,
652 IDX_BM_Command,
653 (AtapiReadPort4(chan,
654 IDX_BM_Command) & ~0x000000c0) |
655 ((Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? 0x00000080 : 0x000000c0) );
656 return;
657*/
658 }
659 break;
660 }
661
662 // set pointer to Pointer Table
664 AtaReq->ata.dma_base
665 );
666 // set transfer direction
669 // clear Error & Intr bits (writeing 1 clears bits)
670 // set DMA capability bit
674 (DeviceNumber ? BM_STATUS_DRIVE_1_DMA : BM_STATUS_DRIVE_0_DMA)*/);
675 // begin transaction
679 return;
680
681} // end AtapiDmaStart()
#define BM_COMMAND_READ
Definition: bsmaster.h:154
#define IDX_BM_PRD_Table
Definition: bsmaster.h:171
#define BM_COMMAND_WRITE
Definition: bsmaster.h:153
#define CTRFLAGS_DMA_ACTIVE
Definition: bsmaster.h:1131

Referenced by AtapiInterrupt__(), AtapiSendCommand(), IdeReadWrite(), and IdeSendCommand().

◆ AtapiFindDev()

ULONG NTAPI AtapiFindDev ( IN PVOID  HwDeviceExtension,
IN BUS_DATA_TYPE  BusDataType,
IN ULONG  BusNumber,
IN ULONG  SlotNumber,
IN ULONG  dev_id,
IN ULONG  RevID 
)

Definition at line 871 of file id_probe.cpp.

879{
880 PCI_COMMON_CONFIG pciData;
881 ULONG funcNumber;
882 ULONG busDataRead;
883
884 ULONG VendorID;
886 PCI_SLOT_NUMBER slotData;
887
888 slotData.u.AsULONG = SlotNumber;
889 // walk through all Function Numbers
890 for(funcNumber = 0; funcNumber < PCI_MAX_FUNCTION; funcNumber++) {
891
892 slotData.u.bits.FunctionNumber = funcNumber;
893 if(slotData.u.AsULONG == SlotNumber)
894 continue;
895
896 busDataRead = HalGetBusData(
897 //busDataRead = ScsiPortGetBusData(HwDeviceExtension,
899 BusNumber,
900 slotData.u.AsULONG,
901 &pciData,
903
904 if (busDataRead < (ULONG)PCI_COMMON_HDR_LENGTH) {
905 continue;
906 }
907
908 VendorID = pciData.VendorID;
909 DeviceID = pciData.DeviceID;
910
911 if(dev_id != (VendorID | (DeviceID << 16)) )
912 continue;
913 if(RevID >= pciData.RevisionID)
914 return 1;
915 }
916 return 0;
917} // end AtapiFindDev()
struct _PCI_SLOT_NUMBER::@4322::@4323 bits
union _PCI_SLOT_NUMBER::@4322 u
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
Definition: halfuncs.h:160
#define PCI_MAX_FUNCTION
Definition: iotypes.h:3601

◆ AtapiFindListedDev()

ULONG NTAPI AtapiFindListedDev ( PBUSMASTER_CONTROLLER_INFORMATION_BASE  BusMasterAdapters,
ULONG  lim,
IN PVOID  HwDeviceExtension,
IN ULONG  BusNumber,
IN ULONG  SlotNumber,
OUT PCI_SLOT_NUMBER _slotData 
)

◆ AtapiGetIoRange()

ULONGIO_PTR NTAPI AtapiGetIoRange ( IN PVOID  HwDeviceExtension,
IN PPORT_CONFIGURATION_INFORMATION  ConfigInfo,
IN PPCI_COMMON_CONFIG  pciData,
IN ULONG  SystemIoBusNumber,
IN ULONG  rid,
IN ULONG  offset,
IN ULONG  length 
)

Definition at line 153 of file id_probe.cpp.

162{
163 ULONGIO_PTR io_start = 0;
164 KdPrint2((PRINT_PREFIX " AtapiGetIoRange:\n"));
165
166 if(ConfigInfo->NumberOfAccessRanges <= rid)
167 return 0;
168
169 KdPrint2((PRINT_PREFIX " AtapiGetIoRange: rid %#x, start %#x, offs %#x, len %#x, mem %#x\n",
170 rid,
171 ScsiPortConvertPhysicalAddressToUlong((*ConfigInfo->AccessRanges)[rid].RangeStart),
172 offset,
173 length,
174 (*ConfigInfo->AccessRanges)[rid].RangeInMemory
175 ));
176
177 if(!(*ConfigInfo->AccessRanges)[rid].RangeInMemory) {
178 io_start = (pciData->u.type0.BaseAddresses[rid] & ~0x07/*PCI_ADDRESS_IOMASK*/) + offset;
179 // if(pciData->u.type0.BaseAddresses[rid] != 0) ;)
180 if(io_start > offset) {
181 if(/*(WinVer_Id() <= WinVer_NT) &&*/ offset && rid == 4) {
182 // MS atapi.sys does so for BusMaster controllers
183 (*ConfigInfo->AccessRanges)[rid+1].RangeStart =
185 (*ConfigInfo->AccessRanges)[rid+1].RangeLength = length;
186 } else {
187 (*ConfigInfo->AccessRanges)[rid].RangeStart =
189 (*ConfigInfo->AccessRanges)[rid].RangeLength = length;
190 }
191 if((pciData->u.type0.BaseAddresses[rid] & PCI_ADDRESS_IO_SPACE)) {
192 (*ConfigInfo->AccessRanges)[rid].RangeInMemory = FALSE;
193 } else {
194 KdPrint2((PRINT_PREFIX " AtapiGetIoRange: adjust mem 0 -> 1\n"));
195 (*ConfigInfo->AccessRanges)[rid].RangeInMemory = TRUE;
196 }
197 } else {
198 io_start = 0;
199 }
200 }
201
202 if((*ConfigInfo->AccessRanges)[rid].RangeInMemory) {
203 if(offset) {
204 KdPrint2((PRINT_PREFIX " AtapiGetIoRange: can't map memory range with offset\n"));
205 return 0;
206 }
207 io_start =
208 // Get the system physical address for this IO range.
209 ((ULONG_PTR)ScsiPortGetDeviceBase(HwDeviceExtension,
210 PCIBus /*ConfigInfo->AdapterInterfaceType*/,
211 SystemIoBusNumber /*ConfigInfo->SystemIoBusNumber*/,
213 (ScsiPortConvertPhysicalAddressToUlong((*ConfigInfo->AccessRanges)[rid].RangeStart) &
214 ~0x07/*PCI_ADDRESS_IOMASK*/) + offset
215 ),
216 length,
217 (BOOLEAN)!(*ConfigInfo->AccessRanges)[rid].RangeInMemory)
218 );
219
220 KdPrint2((PRINT_PREFIX " AtapiGetIoRange: %#x\n", io_start));
221 // if(io_start > offset) {
222 return io_start;
223 // }
224 }
225
226 KdPrint2((PRINT_PREFIX " AtapiGetIoRange: (2) %#x\n", io_start));
227 return io_start;
228
229} // end AtapiGetIoRange()
PVOID NTAPI ScsiPortGetDeviceBase(IN PVOID HwDeviceExtension, IN INTERFACE_TYPE BusType, IN ULONG SystemIoBusNumber, IN SCSI_PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfBytes, IN BOOLEAN InIoSpace)
Definition: scsiport.c:575
#define ScsiPortConvertPhysicalAddressToUlong(Address)
Definition: srb.h:957
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
#define BOOLEAN
Definition: pedump.c:73
#define PCI_ADDRESS_IO_SPACE
Definition: iotypes.h:4233

Referenced by UniataAhciDetect(), UniataChipDetect(), and UniataFindBusMasterController().

◆ AtapiInterrupt2()

BOOLEAN NTAPI AtapiInterrupt2 ( IN PKINTERRUPT  Interrupt,
IN PVOID  HwDeviceExtension 
)

Definition at line 4192 of file id_ata.cpp.

4196{
4197 // This ISR is intended to catch interrupts when we are already in other ISR instance
4198 // for the same device. This may happen when we have multiple channels,
4199 // especially on SMP machines
4200
4201 PISR2_DEVICE_EXTENSION Isr2DeviceExtension = (PISR2_DEVICE_EXTENSION)Isr2HwDeviceExtension;
4202 PHW_DEVICE_EXTENSION deviceExtension = Isr2DeviceExtension->HwDeviceExtension;
4203 ULONG c;
4205 ULONG c_count = 0;
4206 ULONG i_res;
4207 ULONG hIS;
4208 ULONG checked;
4209
4210 // we should never get here for ISA/MCA
4211 if(!BMList[deviceExtension->DevIndex].Isr2Enable) {
4212 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: NOT ACTIVE cntrlr %#x chan %#x\n",deviceExtension->DevIndex, deviceExtension->Channel));
4213 return FALSE;
4214 }
4215
4216 if(deviceExtension->HwFlags & UNIATA_AHCI) {
4217 // AHCI may generate state change notification, never skip this check
4218 hIS = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_IS);
4219 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: AHCI: hIS=%x cntrlr %#x chan %#x\n",hIS, deviceExtension->DevIndex, deviceExtension->Channel));
4220 if(!hIS) {
4221 return FALSE;
4222 }
4223 // assume all non-interrupted ports to be already checked
4224 checked = ~hIS;
4225 // assume all not implemented ports to be already checked
4226 checked |= ~deviceExtension->AHCI_PI;
4227
4228 } else {
4229 checked = 0; // assume all ports are not checked
4230 }
4231 if(!deviceExtension->ExpectingInterrupt) {
4232 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: !deviceExtension->ExpectingInterrupt\n"));
4233 deviceExtension->ExpectingInterrupt++;
4234 return FALSE;
4235 }
4236 //deviceExtension->ExpectingInterrupt = 0;
4237
4238 for(c=0; c<deviceExtension->NumberChannels; c++) {
4239 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: cntrlr %#x chan %#x\n",deviceExtension->DevIndex, c));
4240
4241 if((checked>>c) & 0x01)
4242 continue;
4243
4244 checked |= (ULONG)1 << c;
4245
4246 if(CrNtInterlockedExchangeAdd(&(deviceExtension->chan[c].DisableIntr), 0)) {
4247 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: disabled INTR\n"));
4248 continue;
4249 }
4250
4251 if((ULONG)CrNtInterlockedCompareExchange(CRNT_ILK_PTYPE &(deviceExtension->chan[c].CheckIntr),
4254 {
4255 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: !CHECK_INTR_IDLE\n"));
4256 // hunt on unexpected intr (Some devices generate double interrupts,
4257 // some controllers (at least CMD649) interrupt twice with small delay.
4258 // If interrupts are disabled, they queue interrupt and re-issue it later,
4259 // when we do not expect it.
4260 continue;
4261 }
4262
4263 c_count++;
4264 if((i_res = AtapiCheckInterrupt__(deviceExtension, (UCHAR)c))) {
4265
4266 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: intr\n"));
4267 if(i_res == INTERRUPT_REASON_UNEXPECTED) {
4268 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: Catch unexpected\n"));
4269 InterlockedExchange(&(deviceExtension->chan[c].CheckIntr), CHECK_INTR_IDLE);
4270 return TRUE;
4271 }
4272
4273 status = TRUE;
4275 } else {
4276 InterlockedExchange(&(deviceExtension->chan[c].CheckIntr), CHECK_INTR_IDLE);
4277 }
4278 }
4279 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: status %d, c_count %d\n", status, c_count));
4280 if(status && (c_count != deviceExtension->NumberChannels)) {
4281 // there is an active ISR/DPC for one channel, but
4282 // we have an interrupt from another one
4283 // Lets inform current ISR/DPC about new interrupt
4285 } else {
4286 status = FALSE;
4287 }
4288 KdPrint2((PRINT_PREFIX "AtapiInterrupt2: return %d\n", status));
4289 return status;
4290
4291} // end AtapiInterrupt2()
#define InterlockedExchange
Definition: armddk.h:54
#define CHECK_INTR_CHECK
Definition: bsmaster.h:1068
#define IDX_AHCI_IS
Definition: bsmaster.h:272
struct _ISR2_DEVICE_EXTENSION * PISR2_DEVICE_EXTENSION
#define CHECK_INTR_IDLE
Definition: bsmaster.h:1069
#define CHECK_INTR_DETECTED
Definition: bsmaster.h:1067
PBUSMASTER_CONTROLLER_INFORMATION BMList
Definition: id_probe.cpp:53
#define CRNT_ILK_PTYPE
Definition: config.h:104
#define CRNT_ILK_TYPE
Definition: config.h:103
BOOLEAN NTAPI AtapiCheckInterrupt__(IN PVOID HwDeviceExtension, IN UCHAR c)
Definition: id_ata.cpp:4512
#define UniataAhciReadHostPort4(deviceExtension, io_port_ndx)
Definition: id_sata.h:313
LONG CheckIntr
Definition: bsmaster.h:1062
LONG DisableIntr
Definition: bsmaster.h:1061
BOOLEAN ExpectingInterrupt
Definition: atapi.c:99
PHW_DEVICE_EXTENSION HwDeviceExtension
Definition: bsmaster.h:1351
Definition: ps.c:97
#define INTERRUPT_REASON_UNEXPECTED
Definition: atapi.h:1280

Referenced by UniataConnectIntr2().

◆ AtapiReadBuffer2()

VOID DDKFASTAPI AtapiReadBuffer2 ( IN PHW_CHANNEL  chan,
IN ULONGIO_PTR  _port,
IN PVOID  Buffer,
IN ULONG  Count,
IN ULONG  Timing 
)

◆ AtapiReadBuffer4()

VOID DDKFASTAPI AtapiReadBuffer4 ( IN PHW_CHANNEL  chan,
IN ULONGIO_PTR  _port,
IN PVOID  Buffer,
IN ULONG  Count,
IN ULONG  Timing 
)

◆ AtapiReadChipConfig()

BOOLEAN NTAPI AtapiReadChipConfig ( IN PVOID  HwDeviceExtension,
IN ULONG  DeviceNumber,
IN ULONG  channel 
)

Definition at line 1789 of file id_init.cpp.

1794{
1795 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
1796 PHW_CHANNEL chan;
1797 ULONG tmp32;
1798 ULONG c; // logical channel (for Compatible Mode controllers)
1799 ULONG i;
1800
1801 KdPrint2((PRINT_PREFIX "AtapiReadChipConfig: devExt %#x\n", deviceExtension ));
1802 ASSERT(deviceExtension);
1803
1804 if(channel != CHAN_NOT_SPECIFIED) {
1805 c = channel - deviceExtension->Channel; // logical channel (for Compatible Mode controllers)
1806 } else {
1808 }
1809
1810 KdPrint2((PRINT_PREFIX "AtapiReadChipConfig: dev %#x, ph chan %d\n", DeviceNumber, channel ));
1811
1812 if(channel == CHAN_NOT_SPECIFIED) {
1813 if(AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"ForceSimplex", FALSE)) {
1814 deviceExtension->simplexOnly = TRUE;
1815 }
1816 deviceExtension->opt_AtapiDmaZeroTransfer = FALSE;
1817 deviceExtension->opt_AtapiDmaControlCmd = FALSE;
1818 deviceExtension->opt_AtapiDmaRawRead = g_opt_AtapiDmaRawRead;
1819 deviceExtension->opt_AtapiDmaReadWrite = TRUE;
1820 }
1821
1822 if(c == CHAN_NOT_SPECIFIED) {
1823 KdPrint2((PRINT_PREFIX "MaxTransferMode (base): %#x\n", deviceExtension->MaxTransferMode));
1824 for(c=0; c<deviceExtension->NumberChannels; c++) {
1825 chan = &deviceExtension->chan[c];
1826 chan->MaxTransferMode = deviceExtension->MaxTransferMode;
1827 tmp32 = AtapiRegCheckDevValue(deviceExtension, channel, DEVNUM_NOT_SPECIFIED, L"MaxTransferMode", chan->MaxTransferMode);
1828 if(tmp32 != 0xffffffff) {
1829 KdPrint2((PRINT_PREFIX "MaxTransferMode (overriden): %#x\n", chan->MaxTransferMode));
1830 chan->MaxTransferMode = tmp32;
1831 }
1832 tmp32 = AtapiRegCheckDevValue(deviceExtension, c, DEVNUM_NOT_SPECIFIED, L"Force80pin", FALSE);
1833 chan->Force80pin = tmp32 ? TRUE : FALSE;
1834 if(chan->Force80pin) {
1835 KdPrint2((PRINT_PREFIX "Force80pin on chip\n"));
1836 deviceExtension->HwFlags |= UNIATA_NO80CHK;
1837 }
1838
1839 //UniAtaReadLunConfig(deviceExtension, c, 0);
1840 //UniAtaReadLunConfig(deviceExtension, c, 1);
1841 }
1842
1843 deviceExtension->opt_AtapiDmaZeroTransfer =
1844 AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"AtapiDmaZeroTransfer", deviceExtension->opt_AtapiDmaZeroTransfer) ?
1845 TRUE : FALSE;
1846
1847 deviceExtension->opt_AtapiDmaControlCmd =
1848 AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"AtapiDmaControlCmd", deviceExtension->opt_AtapiDmaControlCmd) ?
1849 TRUE : FALSE;
1850
1851 deviceExtension->opt_AtapiDmaRawRead =
1852 AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"AtapiDmaRawRead", deviceExtension->opt_AtapiDmaRawRead) ?
1853 TRUE : FALSE;
1854
1855 deviceExtension->opt_AtapiDmaReadWrite =
1856 AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"AtapiDmaReadWrite", deviceExtension->opt_AtapiDmaReadWrite) ?
1857 TRUE : FALSE;
1858
1859 } else {
1860 chan = &deviceExtension->chan[c];
1861 chan->MaxTransferMode = deviceExtension->MaxTransferMode;
1862 tmp32 = AtapiRegCheckDevValue(deviceExtension, c, DEVNUM_NOT_SPECIFIED, L"MaxTransferMode", chan->MaxTransferMode);
1863 if(tmp32 != 0xffffffff) {
1864 KdPrint2((PRINT_PREFIX "MaxTransferMode (overriden): %#x\n", chan->MaxTransferMode));
1865 chan->MaxTransferMode = tmp32;
1866 }
1867 tmp32 = AtapiRegCheckDevValue(deviceExtension, c, DEVNUM_NOT_SPECIFIED, L"ReorderEnable", TRUE);
1868 chan->UseReorder = tmp32 ? TRUE : FALSE;
1869
1870 tmp32 = AtapiRegCheckDevValue(deviceExtension, c, DEVNUM_NOT_SPECIFIED, L"Force80pin", FALSE);
1871 chan->Force80pin = tmp32 ? TRUE : FALSE;
1872 if(chan->Force80pin) {
1873 KdPrint2((PRINT_PREFIX "Force80pin on channel\n"));
1874 }
1875
1876 for(i=0; i<deviceExtension->NumberLuns; i++) {
1877 UniAtaReadLunConfig(deviceExtension, channel, i);
1878 }
1879 }
1880
1881 return TRUE;
1882} // end AtapiReadChipConfig()
BOOLEAN g_opt_AtapiDmaRawRead
Definition: id_ata.cpp:100
#define L(x)
Definition: resources.c:13
VOID NTAPI UniAtaReadLunConfig(IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG channel, IN ULONG DeviceNumber)
Definition: id_init.cpp:1687
BOOLEAN UseReorder
Definition: bsmaster.h:1041
BOOLEAN opt_AtapiDmaReadWrite
Definition: bsmaster.h:1339
BOOLEAN opt_AtapiDmaRawRead
Definition: bsmaster.h:1338
BOOLEAN opt_AtapiDmaControlCmd
Definition: bsmaster.h:1337
BOOLEAN opt_AtapiDmaZeroTransfer
Definition: bsmaster.h:1336
ULONG NTAPI AtapiRegCheckDevValue(IN PVOID HwDeviceExtension, IN ULONG chan, IN ULONG dev, IN PCWSTR Name, IN ULONG Default)
Definition: id_ata.cpp:11359
#define DEVNUM_NOT_SPECIFIED
Definition: atapi.h:1483

Referenced by AtapiFindIsaController(), and UniataFindBusMasterController().

◆ AtapiReadPort1()

◆ AtapiReadPort2()

USHORT DDKFASTAPI AtapiReadPort2 ( IN PHW_CHANNEL  chan,
IN ULONGIO_PTR  port 
)

◆ AtapiReadPort4()

◆ AtapiReadPortEx1()

◆ AtapiReadPortEx4()

◆ AtapiSetupLunPtrs()

VOID NTAPI AtapiSetupLunPtrs ( IN PHW_CHANNEL  chan,
IN PHW_DEVICE_EXTENSION  deviceExtension,
IN ULONG  c 
)

Definition at line 2856 of file id_init.cpp.

2861{
2862 ULONG i;
2863
2864 KdPrint2((PRINT_PREFIX "AtapiSetupLunPtrs for channel %d of %d, %d luns \n", c, deviceExtension->NumberChannels, deviceExtension->NumberLuns));
2865
2866 if(!deviceExtension->NumberLuns) {
2867 KdPrint2((PRINT_PREFIX "Achtung !deviceExtension->NumberLuns \n"));
2868 deviceExtension->NumberLuns = IDE_MAX_LUN_PER_CHAN;
2869 }
2870 KdPrint2((PRINT_PREFIX " Chan %#x\n", chan));
2871 chan->DeviceExtension = deviceExtension;
2872 chan->lChannel = c;
2873 chan->NumberLuns = deviceExtension->NumberLuns;
2874 for(i=0; i<deviceExtension->NumberLuns; i++) {
2875 chan->lun[i] = &(deviceExtension->lun[c*deviceExtension->NumberLuns+i]);
2876 KdPrint2((PRINT_PREFIX " Lun %#x\n", i));
2877 KdPrint2((PRINT_PREFIX " Lun ptr %#x\n", chan->lun[i]));
2878 }
2879 chan->AltRegMap = deviceExtension->AltRegMap;
2880 chan->NextDpcChan = -1;
2881 chan->last_devsel = -1;
2882 for(i=0; i<deviceExtension->NumberLuns; i++) {
2883 chan->lun[i]->DeviceExtension = deviceExtension;
2884 chan->lun[i]->chan = chan;
2885 chan->lun[i]->Lun = i;
2886 }
2887 if((deviceExtension->HwFlags & UNIATA_AHCI) &&
2888 deviceExtension->AhciInternalAtaReq0 &&
2889 deviceExtension->AhciInternalSrb0) {
2890 chan->AhciInternalAtaReq = &(deviceExtension->AhciInternalAtaReq0[c]);
2891 chan->AhciInternalSrb = &(deviceExtension->AhciInternalSrb0[c]);
2892 UniataAhciSetupCmdPtr(chan->AhciInternalAtaReq);
2893 chan->AhciInternalSrb->SrbExtension = chan->AhciInternalAtaReq;
2894 chan->AhciInternalAtaReq->Srb = chan->AhciInternalSrb;
2895 }
2896 return;
2897} // end AtapiSetupLunPtrs()
#define IDE_MAX_LUN_PER_CHAN
Definition: bm_devs_decl.h:46
VOID UniataAhciSetupCmdPtr(IN OUT PATA_REQ AtaReq)
Definition: id_sata.cpp:2611

Referenced by AtapiFindIsaController(), UniataAhciInit(), UniataChipDetect(), and UniataFindBusMasterController().

◆ AtapiWriteBuffer2()

VOID DDKFASTAPI AtapiWriteBuffer2 ( IN PHW_CHANNEL  chan,
IN ULONGIO_PTR  _port,
IN PVOID  Buffer,
IN ULONG  Count,
IN ULONG  Timing 
)

◆ AtapiWriteBuffer4()

VOID DDKFASTAPI AtapiWriteBuffer4 ( IN PHW_CHANNEL  chan,
IN ULONGIO_PTR  _port,
IN PVOID  Buffer,
IN ULONG  Count,
IN ULONG  Timing 
)

◆ AtapiWritePort1()

◆ AtapiWritePort2()

VOID DDKFASTAPI AtapiWritePort2 ( IN PHW_CHANNEL  chan,
IN ULONGIO_PTR  port,
IN USHORT  data 
)

Referenced by AtapiChipInit().

◆ AtapiWritePort4()

◆ AtapiWritePortEx1()

VOID DDKFASTAPI AtapiWritePortEx1 ( IN PHW_CHANNEL  chan,
IN ULONGIO_PTR  port,
IN ULONG  offs,
IN UCHAR  data 
)

◆ AtapiWritePortEx4()

◆ ScsiPortGetBusDataByOffset()

ULONG NTAPI ScsiPortGetBusDataByOffset ( IN PVOID  HwDeviceExtension,
IN BUS_DATA_TYPE  BusDataType,
IN ULONG  BusNumber,
IN ULONG  SlotNumber,
IN PVOID  Buffer,
IN ULONG  Offset,
IN ULONG  Length 
)

Definition at line 741 of file id_probe.cpp.

750{
751 UCHAR tmp[256];
752 ULONG busDataRead;
753
754 if(Offset+Length > 256)
755 return 0;
756
757 busDataRead = HalGetBusData(
758 //ScsiPortGetBusData(HwDeviceExtension,
759 BusDataType,
760 BusNumber,
762 &tmp,
763 Offset+Length);
764 if(busDataRead < Offset+Length) {
765 if(busDataRead < Offset)
766 return 0;
767 return (Offset+Length-busDataRead);
768 }
770 return Length;
771} // end ScsiPortGetBusDataByOffset()
Definition: bufpool.h:45
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102

◆ UniataAllocateLunExt()

BOOLEAN NTAPI UniataAllocateLunExt ( PHW_DEVICE_EXTENSION  deviceExtension,
ULONG  NewNumberChannels 
)

Definition at line 2901 of file id_init.cpp.

2905{
2906 PHW_LU_EXTENSION old_luns = NULL;
2907 PHW_CHANNEL old_chans = NULL;
2908
2909 KdPrint2((PRINT_PREFIX "allocate %d Luns for %d channels\n", deviceExtension->NumberLuns, deviceExtension->NumberChannels));
2910
2911 old_luns = deviceExtension->lun;
2912 old_chans = deviceExtension->chan;
2913
2914 if(old_luns || old_chans) {
2915 if(NewNumberChannels == UNIATA_ALLOCATE_NEW_LUNS) {
2916 KdPrint2((PRINT_PREFIX "already allocated!\n"));
2917 return FALSE;
2918 }
2919 }
2920
2921 if(!deviceExtension->NumberLuns) {
2922 KdPrint2((PRINT_PREFIX "default NumberLuns=2\n"));
2923 deviceExtension->NumberLuns = 2;
2924 }
2925
2926 if(deviceExtension->HwFlags & UNIATA_AHCI) {
2927 if(!deviceExtension->AhciInternalAtaReq0) {
2928 deviceExtension->AhciInternalAtaReq0 = (PATA_REQ)ExAllocatePool(NonPagedPool, sizeof(ATA_REQ)*deviceExtension->NumberChannels);
2929 if (!deviceExtension->AhciInternalAtaReq0) {
2930 KdPrint2((PRINT_PREFIX "!deviceExtension->AhciInternalAtaReq0 => SP_RETURN_ERROR\n"));
2931 return FALSE;
2932 }
2933 RtlZeroMemory(deviceExtension->AhciInternalAtaReq0, sizeof(ATA_REQ)*deviceExtension->NumberChannels);
2934 }
2935 if(!deviceExtension->AhciInternalSrb0) {
2937 if (!deviceExtension->AhciInternalSrb0) {
2938 KdPrint2((PRINT_PREFIX "!deviceExtension->AhciInternalSrb0 => SP_RETURN_ERROR\n"));
2939 UniataFreeLunExt(deviceExtension);
2940 return FALSE;
2941 }
2942 RtlZeroMemory(deviceExtension->AhciInternalSrb0, sizeof(SCSI_REQUEST_BLOCK)*deviceExtension->NumberChannels);
2943 }
2944 }
2945
2946 deviceExtension->lun = (PHW_LU_EXTENSION)ExAllocatePool(NonPagedPool, sizeof(HW_LU_EXTENSION) * (deviceExtension->NumberChannels+1) * deviceExtension->NumberLuns);
2947 if (!deviceExtension->lun) {
2948 KdPrint2((PRINT_PREFIX "!deviceExtension->lun => SP_RETURN_ERROR\n"));
2949 UniataFreeLunExt(deviceExtension);
2950 return FALSE;
2951 }
2952 RtlZeroMemory(deviceExtension->lun, sizeof(HW_LU_EXTENSION) * (deviceExtension->NumberChannels+1) * deviceExtension->NumberLuns);
2953
2954 deviceExtension->chan = (PHW_CHANNEL)ExAllocatePool(NonPagedPool, sizeof(HW_CHANNEL) * (deviceExtension->NumberChannels+1));
2955 if (!deviceExtension->chan) {
2956 UniataFreeLunExt(deviceExtension);
2957 KdPrint2((PRINT_PREFIX "!deviceExtension->chan => SP_RETURN_ERROR\n"));
2958 return FALSE;
2959 }
2960 RtlZeroMemory(deviceExtension->chan, sizeof(HW_CHANNEL) * (deviceExtension->NumberChannels+1));
2961 return TRUE;
2962} // end UniataAllocateLunExt()
struct _HW_LU_EXTENSION * PHW_LU_EXTENSION
struct _HW_CHANNEL * PHW_CHANNEL
#define UNIATA_ALLOCATE_NEW_LUNS
Definition: bsmaster.h:1398
struct _SCSI_REQUEST_BLOCK * PSCSI_REQUEST_BLOCK
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
VOID NTAPI UniataFreeLunExt(PHW_DEVICE_EXTENSION deviceExtension)
Definition: id_init.cpp:2966
PSCSI_REQUEST_BLOCK AhciInternalSrb0
Definition: bsmaster.h:1334
PHW_LU_EXTENSION lun
Definition: bsmaster.h:1256
PATA_REQ AhciInternalAtaReq0
Definition: bsmaster.h:1333
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

Referenced by AtapiFindIsaController(), and UniataChipDetect().

◆ UniataChipDetect()

NTSTATUS NTAPI UniataChipDetect ( IN PVOID  HwDeviceExtension,
IN PPCI_COMMON_CONFIG  pciData,
IN ULONG  DeviceNumber,
IN OUT PPORT_CONFIGURATION_INFORMATION  ConfigInfo,
IN BOOLEAN simplexOnly 
)

Definition at line 339 of file id_init.cpp.

346{
347 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
348 ULONG slotNumber = deviceExtension->slotNumber;
349 ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber;
350 ULONG VendorID = deviceExtension->DevID & 0xffff;
351 ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
352 ULONG RevID = deviceExtension->RevID;
353 ULONG i, c;
355 PHW_CHANNEL chan;
356 ULONG ChipType;
357 ULONG ChipFlags;
358 ULONG tmp32;
359 UCHAR tmp8;
360 ULONG_PTR BaseMemAddress;
361 ULONG_PTR BaseIoAddress1;
362 ULONG_PTR BaseIoAddress2;
363 ULONG_PTR BaseIoAddressBM;
364 BOOLEAN MemIo = FALSE;
365 BOOLEAN IsPata = FALSE;
366
367 KdPrint2((PRINT_PREFIX "UniataChipDetect:\n" ));
368 KdPrint2((PRINT_PREFIX "HwFlags: %#x\n", deviceExtension->HwFlags));
369
371
372 c = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"ForceSimplex", 0);
373 if(c) {
374 *simplexOnly = TRUE;
375 }
376
377 // defaults
378 BaseIoAddressBM = pciData->u.type0.BaseAddresses[4] & ~0x07;
379 deviceExtension->MaxTransferMode = BaseIoAddressBM ? ATA_DMA : ATA_PIO4;
380 ConfigInfo->MaximumTransferLength = DEV_BSIZE*256;
381 deviceExtension->MaximumDmaTransferLength = ConfigInfo->MaximumTransferLength;
382 //deviceExtension->NumberOfPhysicalBreaks = min(deviceExtension->MaximumDmaTransferLength/PAGE_SIZE+1, ATA_DMA_ENTRIES);
383 deviceExtension->DmaSegmentLength = 0x10000;
384 deviceExtension->DmaSegmentAlignmentMask = 0xffff;
385
386 KdPrint2((PRINT_PREFIX "i: %#x\n", i));
387 if(i != BMLIST_TERMINATOR) {
389 } else {
390unknown_dev:
391 if(Ata_is_ahci_dev(pciData)) {
392 KdPrint2((PRINT_PREFIX " AHCI candidate"));
393
394 deviceExtension->NumberChannels = 0;
395 if(!UniataAhciDetect(HwDeviceExtension, pciData, ConfigInfo)) {
396 KdPrint2((PRINT_PREFIX " AHCI init failed - not detected\n"));
397 return STATUS_UNSUCCESSFUL;
398 }
399 KdPrint2((PRINT_PREFIX " unknown AHCI dev, addr %#x ", deviceExtension->BaseIoAHCI_0.Addr));
400 }
401 KdPrint2((PRINT_PREFIX " unknown dev, BM addr %#x ", BaseIoAddressBM));
402 DevTypeInfo = NULL;
403 KdPrint2((PRINT_PREFIX " MaxTransferMode %#x\n", deviceExtension->MaxTransferMode));
404
405 if(!UniataChipDetectChannels(HwDeviceExtension, pciData, DeviceNumber, ConfigInfo)) {
406 return STATUS_UNSUCCESSFUL;
407 }
408 if(!UniataAllocateLunExt(deviceExtension, UNIATA_ALLOCATE_NEW_LUNS)) {
409 return STATUS_UNSUCCESSFUL;
410 }
411 return STATUS_SUCCESS;
412 }
413
414 static BUSMASTER_CONTROLLER_INFORMATION_BASE const SiSAdapters[] = {
415 PCI_DEV_HW_SPEC_BM( 1183, 1039, 0x00, ATA_SA150, "SiS 1183 IDE" , SIS133NEW),
416 PCI_DEV_HW_SPEC_BM( 1182, 1039, 0x00, ATA_SA150, "SiS 1182" , SISSATA | UNIATA_SATA),
417 PCI_DEV_HW_SPEC_BM( 0183, 1039, 0x00, ATA_SA150, "SiS 183 RAID" , SISSATA | UNIATA_SATA),
418 PCI_DEV_HW_SPEC_BM( 0182, 1039, 0x00, ATA_SA150, "SiS 182" , SISSATA | UNIATA_SATA),
419 PCI_DEV_HW_SPEC_BM( 0181, 1039, 0x00, ATA_SA150, "SiS 181" , SISSATA | UNIATA_SATA),
420 PCI_DEV_HW_SPEC_BM( 0180, 1039, 0x00, ATA_SA150, "SiS 180" , SISSATA | UNIATA_SATA),
421 PCI_DEV_HW_SPEC_BM( 0965, 1039, 0x00, ATA_UDMA6, "SiS 965" , SIS133NEW ),
422 PCI_DEV_HW_SPEC_BM( 0964, 1039, 0x00, ATA_UDMA6, "SiS 964" , SIS133NEW ),
423 PCI_DEV_HW_SPEC_BM( 0963, 1039, 0x00, ATA_UDMA6, "SiS 963" , SIS133NEW ),
424 PCI_DEV_HW_SPEC_BM( 0962, 1039, 0x00, ATA_UDMA6, "SiS 962" , SIS133NEW ),
425
426 PCI_DEV_HW_SPEC_BM( 0745, 1039, 0x00, ATA_UDMA5, "SiS 745" , SIS100NEW ),
427 PCI_DEV_HW_SPEC_BM( 0735, 1039, 0x00, ATA_UDMA5, "SiS 735" , SIS100NEW ),
428 PCI_DEV_HW_SPEC_BM( 0733, 1039, 0x00, ATA_UDMA5, "SiS 733" , SIS100NEW ),
429 PCI_DEV_HW_SPEC_BM( 0730, 1039, 0x00, ATA_UDMA5, "SiS 730" , SIS100OLD ),
430
431 PCI_DEV_HW_SPEC_BM( 0646, 1039, 0x00, ATA_UDMA6, "SiS 645DX", SIS133NEW ),
432/* PCI_DEV_HW_SPEC_BM( 0645, 1039, 0x00, ATA_UDMA6, "SiS 645" , SIS133NEW ),*/
433/* PCI_DEV_HW_SPEC_BM( 0640, 1039, 0x00, ATA_UDMA4, "SiS 640" , SIS_SOUTH ),*/
434 PCI_DEV_HW_SPEC_BM( 0635, 1039, 0x00, ATA_UDMA5, "SiS 635" , SIS100NEW ),
435 PCI_DEV_HW_SPEC_BM( 0633, 1039, 0x00, ATA_UDMA5, "SiS 633" , SIS100NEW ),
436 PCI_DEV_HW_SPEC_BM( 0630, 1039, 0x30, ATA_UDMA5, "SiS 630S" , SIS100OLD ),
437 PCI_DEV_HW_SPEC_BM( 0630, 1039, 0x00, ATA_UDMA4, "SiS 630" , SIS66 ),
438 PCI_DEV_HW_SPEC_BM( 0620, 1039, 0x00, ATA_UDMA4, "SiS 620" , SIS66 ),
439
440 PCI_DEV_HW_SPEC_BM( 0550, 1039, 0x00, ATA_UDMA5, "SiS 550" , SIS66 ),
441 PCI_DEV_HW_SPEC_BM( 0540, 1039, 0x00, ATA_UDMA4, "SiS 540" , SIS66 ),
442 PCI_DEV_HW_SPEC_BM( 0530, 1039, 0x00, ATA_UDMA4, "SiS 530" , SIS66 ),
443
444// PCI_DEV_HW_SPEC_BM( 0008, 1039, 0x04, ATA_UDMA6, "SiS 962L" , SIS133OLD ), // ???
445// PCI_DEV_HW_SPEC_BM( 0008, 1039, 0x00, ATA_UDMA6, "SiS 961" , SIS133OLD ),
446
447 PCI_DEV_HW_SPEC_BM( 5517, 1039, 0x00, ATA_UDMA5, "SiS 961" , SIS100NEW | SIS_BASE ),
448 PCI_DEV_HW_SPEC_BM( 5518, 1039, 0x00, ATA_UDMA6, "SiS 962/3", SIS133NEW | SIS_BASE ),
449 PCI_DEV_HW_SPEC_BM( 5513, 1039, 0xc2, ATA_UDMA2, "SiS 5513" , SIS33 | SIS_BASE ),
450 PCI_DEV_HW_SPEC_BM( 5513, 1039, 0x00, ATA_WDMA2, "SiS 5513" , SIS33 | SIS_BASE ),
451 PCI_DEV_HW_SPEC_BM( 0601, 1039, 0x00, ATA_UDMA2, "SiS 5513" , SIS33 | SIS_BASE ),
453 };
454
455 static BUSMASTER_CONTROLLER_INFORMATION_BASE const ViaAdapters[] = {
456 PCI_DEV_HW_SPEC_BM( 0586, 1106, 0x41, ATA_UDMA2, "VIA 82C586B", VIA33 | 0x00 ),
457 PCI_DEV_HW_SPEC_BM( 0586, 1106, 0x40, ATA_UDMA2, "VIA 82C586B", VIA33 | VIAPRQ ),
458 PCI_DEV_HW_SPEC_BM( 0586, 1106, 0x02, ATA_UDMA2, "VIA 82C586B", VIA33 | 0x00 ),
459 PCI_DEV_HW_SPEC_BM( 0586, 1106, 0x00, ATA_WDMA2, "VIA 82C586" , VIA33 | 0x00 ),
460 PCI_DEV_HW_SPEC_BM( 0596, 1106, 0x12, ATA_UDMA4, "VIA 82C596B", VIA66 | VIACLK ),
461 PCI_DEV_HW_SPEC_BM( 0596, 1106, 0x00, ATA_UDMA2, "VIA 82C596" , VIA33 | 0x00 ),
462 PCI_DEV_HW_SPEC_BM( 0686, 1106, 0x40, ATA_UDMA5, "VIA 82C686B", VIA100 | VIABUG ),
463 PCI_DEV_HW_SPEC_BM( 0686, 1106, 0x10, ATA_UDMA4, "VIA 82C686A", VIA66 | VIACLK ),
464 PCI_DEV_HW_SPEC_BM( 0686, 1106, 0x00, ATA_UDMA2, "VIA 82C686" , VIA33 | 0x00 ),
465 PCI_DEV_HW_SPEC_BM( 8231, 1106, 0x00, ATA_UDMA5, "VIA 8231" , VIA100 | VIABUG ),
466 PCI_DEV_HW_SPEC_BM( 3074, 1106, 0x00, ATA_UDMA5, "VIA 8233" , VIA100 | 0x00 ),
467 PCI_DEV_HW_SPEC_BM( 3109, 1106, 0x00, ATA_UDMA5, "VIA 8233C" , VIA100 | 0x00 ),
468 PCI_DEV_HW_SPEC_BM( 3147, 1106, 0x00, ATA_UDMA6, "VIA 8233A" , VIA133 | 0x00 ),
469 PCI_DEV_HW_SPEC_BM( 3177, 1106, 0x00, ATA_UDMA6, "VIA 8235" , VIA133 | 0x00 ),
470 PCI_DEV_HW_SPEC_BM( 3227, 1106, 0x00, ATA_UDMA6, "VIA 8237" , VIA133 | 0x00 ),
471 PCI_DEV_HW_SPEC_BM( 0591, 1106, 0x00, ATA_UDMA6, "VIA 8237A" , VIA133 | 0x00 ),
472 // presence of AHCI controller means something about isa-mapped part
473 PCI_DEV_HW_SPEC_BM( 5337, 1106, 0x00, ATA_UDMA6, "VIA 8237S" , VIA133 | 0x00 ),
474 PCI_DEV_HW_SPEC_BM( 5372, 1106, 0x00, ATA_UDMA6, "VIA 8237" , VIA133 | 0x00 ),
475 PCI_DEV_HW_SPEC_BM( 7372, 1106, 0x00, ATA_UDMA6, "VIA 8237" , VIA133 | 0x00 ),
476 PCI_DEV_HW_SPEC_BM( 3349, 1106, 0x00, ATA_UDMA6, "VIA 8251" , VIA133 | 0x00 ),
477 PCI_DEV_HW_SPEC_BM( 8324, 1106, 0x00, ATA_SA150, "VIA CX700" , VIANEW | VIASATA),
478 PCI_DEV_HW_SPEC_BM( 8353, 1106, 0x00, ATA_SA150, "VIA VX800" , VIANEW | VIASATA),
479 PCI_DEV_HW_SPEC_BM( 8409, 1106, 0x00, ATA_UDMA6, "VIA VX855" , VIA133 | 0x00 ),
480 PCI_DEV_HW_SPEC_BM( 8410, 1106, 0x00, ATA_SA300, "VIA VX900" , VIANEW | VIASATA),
482 };
483
484 static BUSMASTER_CONTROLLER_INFORMATION_BASE const ViaSouthAdapters[] = {
485 PCI_DEV_HW_SPEC_BM( 3112, 1106, 0x00, ATA_MODE_NOT_SPEC, "VIA 8361", VIASOUTH ),
486 PCI_DEV_HW_SPEC_BM( 0305, 1106, 0x00, ATA_MODE_NOT_SPEC, "VIA 8363", VIASOUTH ),
487 PCI_DEV_HW_SPEC_BM( 0391, 1106, 0x00, ATA_MODE_NOT_SPEC, "VIA 8371", VIASOUTH ),
488 PCI_DEV_HW_SPEC_BM( 3102, 1106, 0x00, ATA_MODE_NOT_SPEC, "VIA 8662", VIASOUTH ),
490 };
491
492 KdPrint2((PRINT_PREFIX "VendorID/DeviceID/Rev %#x/%#x/%#x\n", VendorID, DeviceID, RevID));
493
494 switch(VendorID) {
495
496 case ATA_SIS_ID:
497 /*
498 We shall get here for all SIS controllers, even unlisted.
499 Then perform bus scan to find SIS bridge and decide what to do with controller
500 */
501 KdPrint2((PRINT_PREFIX "ATA_SIS_ID\n"));
502 DevTypeInfo = (BUSMASTER_CONTROLLER_INFORMATION_BASE*)&SiSAdapters[0];
503 i = AtapiFindListedDev(DevTypeInfo, -1, HwDeviceExtension, SystemIoBusNumber, PCISLOTNUM_NOT_SPECIFIED, NULL);
504 if(i != BMLIST_TERMINATOR) {
505 deviceExtension->FullDevName = SiSAdapters[i].FullDevName;
506 }
507 goto for_ugly_chips;
508
509 case ATA_VIA_ID:
510 KdPrint2((PRINT_PREFIX "ATA_VIA_ID\n"));
511 // New chips have own DeviceId
512 if(deviceExtension->DevID != ATA_VIA82C571 &&
513 deviceExtension->DevID != ATA_VIACX700IDE &&
514 deviceExtension->DevID != ATA_VIASATAIDE &&
515 deviceExtension->DevID != ATA_VIASATAIDE2 &&
516 deviceExtension->DevID != ATA_VIASATAIDE3) {
517 KdPrint2((PRINT_PREFIX "Via new\n"));
518 break;
519 }
520 KdPrint2((PRINT_PREFIX "Via-old-style %x\n", deviceExtension->DevID));
521 // Traditionally, chips have same DeviceId, we can distinguish between them
522 // only by ISA Bridge DeviceId
523 DevTypeInfo = (BUSMASTER_CONTROLLER_INFORMATION_BASE*)&ViaSouthAdapters[0];
524 i = AtapiFindListedDev(DevTypeInfo, -1, HwDeviceExtension, SystemIoBusNumber,
525 PCISLOTNUM_NOT_SPECIFIED/*slotNumber*/, NULL);
526/* if(i == BMLIST_TERMINATOR) {
527 i = AtapiFindListedDev(DevTypeInfo, -1, HwDeviceExtension, SystemIoBusNumber, PCISLOTNUM_NOT_SPECIFIED, NULL);
528 }*/
529 if(i != BMLIST_TERMINATOR) {
530 KdPrint2((PRINT_PREFIX "VIASOUTH\n"));
531 deviceExtension->HwFlags |= VIASOUTH;
532 }
533 DevTypeInfo = (BUSMASTER_CONTROLLER_INFORMATION_BASE*)&ViaAdapters[0];
534 i = AtapiFindListedDev(DevTypeInfo, -1, HwDeviceExtension, SystemIoBusNumber,
535 PCISLOTNUM_NOT_SPECIFIED/*slotNumber*/, NULL);
536 if(i != BMLIST_TERMINATOR) {
537 deviceExtension->FullDevName = ViaAdapters[i].FullDevName;
538 }
539 goto for_ugly_chips;
540
541 default:
542
543 // do nothing
544 break;
545
546#if 0
547 KdPrint2((PRINT_PREFIX "Default\n"));
548
549 deviceExtension->MaxTransferMode = deviceExtension->BaseIoAddressBM_0 ? ATA_DMA : ATA_PIO4;
550 /* do extra chipset specific setups */
551 switch(deviceExtension->DevID) {
552
553 //case ATA_CYPRESS_ID:
554 case 0xc6931080: /* 82c693 ATA controller */
555 deviceExtension->MaxTransferMode = ATA_WDMA2;
556 break;
557
558 case 0x000116ca: /* Cenatek Rocket Drive controller */
559 deviceExtension->MaxTransferMode = ATA_WDMA2;
560 break;
561
562/* case ATA_CYRIX_ID:
563 DevTypeInfo = &CyrixAdapters[0];
564 break;*/
565 case 0x01021078: /* Cyrix 5530 ATA33 controller */
566 deviceExtension->MaxTransferMode = ATA_UDMA2;
567 break;
568
569 case 0x06401039: /* CMD 640 known bad, no DMA */
570 case 0x06011039:
571 *simplexOnly = TRUE;
572
573 /* FALLTHROUGH */
574
575 case 0x10001042: /* RZ 100x known bad, no DMA */
576 case 0x10011042:
577
578 if(deviceExtension->BaseIoAddressBM_0)
579 ScsiPortFreeDeviceBase(HwDeviceExtension,
580 deviceExtension->BaseIoAddressBM_0);
581
582 UniataInitIoResEx(&deviceExtension->BaseIoAddressBM_0, 0, FALSE, FALSE);
583 deviceExtension->BusMaster = DMA_MODE_NONE;
584 deviceExtension->MaxTransferMode = ATA_PIO4;
585 break;
586
587 case 0x81721283: /* IT8172 IDE controller */
588 deviceExtension->MaxTransferMode = ATA_UDMA2;
589 *simplexOnly = TRUE;
590 break;
591
592 default:
593 return STATUS_NOT_FOUND;
594 }
595 return STATUS_SUCCESS;
596#endif
597 }
598
599 i = Ata_is_dev_listed(DevTypeInfo, VendorID, DeviceID, RevID, -1);
600for_ugly_chips:
601 KdPrint2((PRINT_PREFIX "i: %#x\n", i));
602 if(i == BMLIST_TERMINATOR) {
603 goto unknown_dev;
604 //return STATUS_NOT_FOUND;
605 }
606 deviceExtension->MaxTransferMode = DevTypeInfo[i].MaxTransferMode;
607 deviceExtension->HwFlags |= DevTypeInfo[i].RaidFlags;
608
609 KdPrint2((PRINT_PREFIX "HwFlags: %#x\n", deviceExtension->HwFlags));
610
611 tmp32 = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"HwFlagsOverride", deviceExtension->HwFlags);
612 KdPrint2((PRINT_PREFIX "HwFlagsOverride: %#x\n", tmp32));
613 deviceExtension->HwFlags = tmp32;
614
615 tmp32 = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"HwFlagsAdd", 0);
616 KdPrint2((PRINT_PREFIX "HwFlagsAdd: %#x\n", tmp32));
617 deviceExtension->HwFlags |= tmp32;
618
619 KdPrint2((PRINT_PREFIX "HwFlags (final): %#x\n", deviceExtension->HwFlags));
620 if(deviceExtension->HwFlags & UNIATA_SIMPLEX_ONLY) {
621 KdPrint2((PRINT_PREFIX "UNIATA_SIMPLEX_ONLY\n" ));
622 *simplexOnly = TRUE;
623 }
624
625 KdPrint2((PRINT_PREFIX "MaxTransferMode: %#x\n", deviceExtension->MaxTransferMode));
626 tmp32 = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"MaxTransferMode", deviceExtension->MaxTransferMode);
627 if(tmp32 != 0xffffffff) {
628 KdPrint2((PRINT_PREFIX "MaxTransferMode (overriden): %#x\n", deviceExtension->MaxTransferMode));
629 deviceExtension->MaxTransferMode = tmp32;
630 }
631
632 if(deviceExtension->MaxTransferMode >= ATA_SA150) {
633 KdPrint2((PRINT_PREFIX "setting UNIATA_SATA flag\n"));
634 deviceExtension->HwFlags |= UNIATA_SATA;
635 }
636
637/*
638 ConfigInfo->MaximumTransferLength = DEV_BSIZE*256;
639 deviceExtension->MaximumDmaTransferLength = ConfigInfo->MaximumTransferLength;
640*/
641 ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK;
642 ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
643
644 /* for even more ugly AHCI-capable chips */
645 if(ChipFlags & UNIATA_AHCI) {
646 /*
647 Seems, some chips may have inoperable/alternative BAR5 in SATA mode
648 This can be detected via PCI SubClass
649 */
650 switch(VendorID) {
651 case ATA_NVIDIA_ID:
652 case ATA_ATI_ID:
653 KdPrint2((PRINT_PREFIX "ATA_xxx_ID check AHCI subclass\n"));
654 if((pciData)->SubClass == PCI_DEV_SUBCLASS_IDE) {
655 KdPrint2((PRINT_PREFIX "Non-AHCI mode\n"));
656 ChipFlags &= ~UNIATA_AHCI;
657 deviceExtension->HwFlags &= ~UNIATA_AHCI;
658 }
659 break;
660 default:
661#ifdef __REACTOS__
662 /* I assume:
663 * - RangeStart == 0LL, "always". (CORE-13346)
664 * - It will be updated by UniataAhciDetect() a few lines below...
665 */
666#else
667 if(!ScsiPortConvertPhysicalAddressToUlong((*ConfigInfo->AccessRanges)[5].RangeStart)) {
668 KdPrint2((PRINT_PREFIX "No BAR5, try BM\n"));
669 ChipFlags &= ~UNIATA_AHCI;
670 deviceExtension->HwFlags &= ~UNIATA_AHCI;
671 }
672#endif
673 break;
674 }
675 }
676
677 if(ChipFlags & UNIATA_AHCI) {
678
679 deviceExtension->NumberChannels = 0;
680 if(!UniataAhciDetect(HwDeviceExtension, pciData, ConfigInfo)) {
681 KdPrint2((PRINT_PREFIX " AHCI detect failed\n"));
682 return STATUS_UNSUCCESSFUL;
683 }
684
685 } else
686 if(!UniataChipDetectChannels(HwDeviceExtension, pciData, DeviceNumber, ConfigInfo)) {
687 return STATUS_UNSUCCESSFUL;
688 }
689 // UniataAhciDetect() sets proper number of channels
690 if(!UniataAllocateLunExt(deviceExtension, UNIATA_ALLOCATE_NEW_LUNS)) {
691 return STATUS_UNSUCCESSFUL;
692 }
693
694 switch(VendorID) {
695 case ATA_ACER_LABS_ID:
696 if(ChipFlags & UNIATA_SATA) {
697 deviceExtension->AltRegMap = TRUE; // inform generic resource allocator
698 BaseIoAddress1 = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
699 0, 0, 0x10);
700 BaseIoAddress2 = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
701 1, 0, 0x10);
702 BaseIoAddressBM = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
703 4, 0, deviceExtension->NumberChannels*sizeof(IDE_BUSMASTER_REGISTERS));
704 for(c=0; c<deviceExtension->NumberChannels; c++) {
705 //ULONG unit01 = (c & 1);
706 ULONG unit10 = (c & 2);
707 chan = &deviceExtension->chan[c];
708
709 for (i=0; i<=IDX_IO1_SZ; i++) {
710 UniataInitIoRes(chan, IDX_IO1+i, BaseIoAddress1 + i + (unit10 ? 8 : 0), FALSE, FALSE);
711 }
712 UniataInitIoRes(chan, IDX_IO2_AltStatus, BaseIoAddress2 + 2 + (unit10 ? 4 : 0), FALSE, FALSE);
714
715 for (i=0; i<=IDX_BM_IO_SZ; i++) {
716 UniataInitIoRes(chan, IDX_BM_IO+i, BaseIoAddressBM + i + (c * sizeof(IDE_BUSMASTER_REGISTERS)), FALSE, FALSE);
717 }
718
719 // SATA not supported yet
720
721 //chan->RegTranslation[IDX_BM_Command] = BaseMemAddress + 0x260 + offs7;
722 //chan->RegTranslation[IDX_BM_PRD_Table] = BaseMemAddress + 0x244 + offs7;
723 //chan->RegTranslation[IDX_BM_DeviceSpecific0] = BaseMemAddress + (c << 2);
724
726 }
727 }
728 break;
729 case ATA_NVIDIA_ID:
730 if(ChipFlags & UNIATA_SATA) {
731 KdPrint2((PRINT_PREFIX "NVIDIA SATA\n"));
732 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
733 5, 0, ((ChipFlags & NV4OFF) ? 0x400 : 0) + 0x40*2);
734 KdPrint2((PRINT_PREFIX "BaseMemAddress %x\n", BaseMemAddress));
735 if(!BaseMemAddress) {
736 return STATUS_UNSUCCESSFUL;
737 }
738 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
739 KdPrint2((PRINT_PREFIX "MemIo\n"));
740 MemIo = TRUE;
741 }
742 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
743 for(c=0; c<deviceExtension->NumberChannels; c++) {
744 chan = &deviceExtension->chan[c];
745
746 UniataInitIoRes(chan, IDX_SATA_SStatus, BaseMemAddress + (c << 6), MemIo, FALSE);
747 UniataInitIoRes(chan, IDX_SATA_SError, BaseMemAddress + 4 + (c << 6), MemIo, FALSE);
748 UniataInitIoRes(chan, IDX_SATA_SControl, BaseMemAddress + 8 + (c << 6), MemIo, FALSE);
749
751 }
752 }
753 break;
754 case ATA_PROMISE_ID:
755
756 if(ChipType != PRMIO) {
757 break;
758 }
759 if(!pciData) {
760 break;
761 }
762 deviceExtension->AltRegMap = TRUE; // inform generic resource allocator
763
764 /* BAR4 -> res1 */
765 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
766 4, 0, 0x4000);
767 KdPrint2((PRINT_PREFIX "BaseMemAddress[4] %x\n", BaseMemAddress));
768 if(!BaseMemAddress) {
769 return STATUS_UNSUCCESSFUL;
770 }
771 if((*ConfigInfo->AccessRanges)[4].RangeInMemory) {
772 KdPrint2((PRINT_PREFIX "MemIo\n"));
773 MemIo = TRUE;
774 }
775 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
776
777 /* BAR3 -> res2 */
778 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
779 3, 0, 0xd0000);
780 KdPrint2((PRINT_PREFIX "BaseMemAddress[3] %x\n", BaseMemAddress));
781 if(!BaseMemAddress) {
782 return STATUS_UNSUCCESSFUL;
783 }
784 if((*ConfigInfo->AccessRanges)[3].RangeInMemory) {
785 KdPrint2((PRINT_PREFIX "MemIo\n"));
786 MemIo = TRUE;
787 }
788 UniataInitIoResEx(&deviceExtension->BaseIoAddressBM_0, BaseMemAddress, MemIo, FALSE);
789
790 if(!(ChipFlags & UNIATA_SATA)) {
791 UCHAR reg48;
792
793 reg48 = AtapiReadPortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0),0x48);
794 deviceExtension->NumberChannels = ((reg48 & 0x01) ? 1 : 0) +
795 ((reg48 & 0x02) ? 1 : 0) +
796 2;
797 KdPrint2((PRINT_PREFIX "Channels -> %d\n", deviceExtension->NumberChannels));
798 }
799
800 for(c=0; c<deviceExtension->NumberChannels; c++) {
801
802 /* res2-based */
803 ULONG offs8, offs7;
804
805 chan = &deviceExtension->chan[c];
806
807 offs8 = c << 8;
808 offs7 = c << 7;
809
810 for (i=0; i<=IDX_IO1_SZ; i++) {
811 UniataInitIoRes(chan, IDX_IO1+i, BaseMemAddress + 0x200 + (i << 2) + offs8, MemIo, FALSE);
812 }
813 UniataInitIoRes(chan, IDX_IO2_AltStatus, BaseMemAddress + 0x238 + offs7, MemIo, FALSE);
814
816
817 UniataInitIoRes(chan, IDX_BM_Command, BaseMemAddress + 0x260 + offs7, MemIo, FALSE);
818 UniataInitIoRes(chan, IDX_BM_PRD_Table, BaseMemAddress + 0x244 + offs7, MemIo, FALSE);
819 UniataInitIoRes(chan, IDX_BM_DeviceSpecific0, BaseMemAddress + (c << 2), MemIo, FALSE);
820
821 if((ChipFlags & PRSATA) ||
822 ((ChipFlags & PRCMBO) && c<2)) {
823 KdPrint2((PRINT_PREFIX "Promise SATA\n"));
824
825 UniataInitIoRes(chan, IDX_SATA_SStatus, BaseMemAddress + 0x400 + offs7, MemIo, FALSE);
826 UniataInitIoRes(chan, IDX_SATA_SError, BaseMemAddress + 0x404 + offs7, MemIo, FALSE);
827 UniataInitIoRes(chan, IDX_SATA_SControl, BaseMemAddress + 0x408 + offs7, MemIo, FALSE);
828
830 } else {
831 KdPrint2((PRINT_PREFIX "Promise PATA\n"));
832 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA6);
833 }
834 }
835 break;
836
837 case ATA_ATI_ID:
838 KdPrint2((PRINT_PREFIX "ATI\n"));
839 if(ChipType == ATI700) {
840 KdPrint2((PRINT_PREFIX "ATI700\n"));
841 if(!(ChipFlags & UNIATA_AHCI)) {
842 KdPrint2((PRINT_PREFIX "IXP700 PATA\n"));
843 chan = &deviceExtension->chan[0];
844 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA5);
845 }
846 break;
847 }
848 /* FALLTHROUGH */
850
851 if(ChipFlags & SIIBUG) {
852 }
853 if(ChipType != SIIMIO) {
854 break;
855 }
856 if(!pciData) {
857 break;
858 }
859
860 if(VendorID == ATA_SILICON_IMAGE_ID) {
861 KdPrint2((PRINT_PREFIX "New SII\n"));
862 } else {
863 KdPrint2((PRINT_PREFIX "ATI SATA\n"));
864 }
865 //if(deviceExtension->HwFlags & SII4CH) {
866 deviceExtension->AltRegMap = TRUE; // inform generic resource allocator
867 //}
868 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
869 5, 0, 0x800);
870 KdPrint2((PRINT_PREFIX "BaseMemAddress %x\n", BaseMemAddress));
871 if(!BaseMemAddress) {
872 return STATUS_UNSUCCESSFUL;
873 }
874 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
875 KdPrint2((PRINT_PREFIX "MemIo\n"));
876 MemIo = TRUE;
877 }
878 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
879
880 for(c=0; c<deviceExtension->NumberChannels; c++) {
881 ULONG unit01 = (c & 1);
882 ULONG unit10 = (c & 2);
883
884 chan = &deviceExtension->chan[c];
885
886 if(deviceExtension->AltRegMap) {
887 for (i=0; i<=IDX_IO1_SZ; i++) {
888 UniataInitIoRes(chan, IDX_IO1+i, BaseMemAddress + 0x80 + i + (unit01 << 6) + (unit10 << 8), MemIo, FALSE);
889 }
890 UniataInitIoRes(chan, IDX_IO2_AltStatus, BaseMemAddress + 0x8a + (unit01 << 6) + (unit10 << 8), MemIo, FALSE);
892
893 UniataInitIoRes(chan, IDX_BM_Command, BaseMemAddress + 0x00 + (unit01 << 3) + (unit10 << 8), MemIo, FALSE);
894 UniataInitIoRes(chan, IDX_BM_Status, BaseMemAddress + 0x02 + (unit01 << 3) + (unit10 << 8), MemIo, FALSE);
895 UniataInitIoRes(chan, IDX_BM_PRD_Table, BaseMemAddress + 0x04 + (unit01 << 3) + (unit10 << 8), MemIo, FALSE);
896 UniataInitIoRes(chan, IDX_BM_DeviceSpecific0, BaseMemAddress + 0x10 + (unit01 << 3) + (unit10 << 8), MemIo, FALSE);
897 UniataInitIoRes(chan, IDX_BM_DeviceSpecific1, BaseMemAddress + 0x40 + (unit01 << 2) + (unit10 << 8), MemIo, FALSE);
898 }
899
900 if(chan->MaxTransferMode < ATA_SA150) {
901 // do nothing for PATA part
902 KdPrint2((PRINT_PREFIX "No SATA regs for PATA part\n"));
903 } else
904 if(ChipFlags & UNIATA_SATA) {
905 UniataInitIoRes(chan, IDX_SATA_SStatus, BaseMemAddress + 0x104 + (unit01 << 7) + (unit10 << 8), MemIo, FALSE);
906 UniataInitIoRes(chan, IDX_SATA_SError, BaseMemAddress + 0x108 + (unit01 << 2) + (unit10 << 8), MemIo, FALSE);
907 UniataInitIoRes(chan, IDX_SATA_SControl, BaseMemAddress + 0x100 + (unit01 << 2) + (unit10 << 8), MemIo, FALSE);
908
910 }
911 }
912 break; }
913
914 case ATA_SERVERWORKS_ID: {
915
916 if(ChipType != SWKSMIO) {
917 break;
918 }
919 if(!pciData) {
920 break;
921 }
922
923 KdPrint2((PRINT_PREFIX "ServerWorks\n"));
924
925 deviceExtension->AltRegMap = TRUE; // inform generic resource allocator
926 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
927 5, 0, 0x400);
928 KdPrint2((PRINT_PREFIX "BaseMemAddress %x\n", BaseMemAddress));
929 if(!BaseMemAddress) {
930 return STATUS_UNSUCCESSFUL;
931 }
932 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
933 KdPrint2((PRINT_PREFIX "MemIo\n"));
934 MemIo = TRUE;
935 }
936 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
937
938 for(c=0; c<deviceExtension->NumberChannels; c++) {
939 ULONG offs = c*0x100;
940
941 chan = &deviceExtension->chan[c];
942 for (i=0; i<=IDX_IO1_SZ; i++) {
943 UniataInitIoRes(chan, IDX_IO1+i, BaseMemAddress + offs + i*4, MemIo, FALSE);
944 }
945 UniataInitIoRes(chan, IDX_IO2_AltStatus, BaseMemAddress + offs + 0x20, MemIo, FALSE);
947
948 UniataInitIoRes(chan, IDX_BM_Command, BaseMemAddress + offs + 0x30, MemIo, FALSE);
949 UniataInitIoRes(chan, IDX_BM_Status, BaseMemAddress + offs + 0x32, MemIo, FALSE);
950 UniataInitIoRes(chan, IDX_BM_PRD_Table, BaseMemAddress + offs + 0x34, MemIo, FALSE);
951
952 UniataInitIoRes(chan, IDX_SATA_SStatus, BaseMemAddress + offs + 0x40, MemIo, FALSE);
953 UniataInitIoRes(chan, IDX_SATA_SError, BaseMemAddress + offs + 0x44, MemIo, FALSE);
954 UniataInitIoRes(chan, IDX_SATA_SControl, BaseMemAddress + offs + 0x48, MemIo, FALSE);
955
957 }
958 break; }
959
960 case ATA_SIS_ID: {
961 //if(ChipType != SIS_SOUTH) {}
962 BOOLEAN SIS_182=FALSE;
963
964 if(!(ChipFlags & SIS_BASE)) {
965 KdPrint2((PRINT_PREFIX "Found SIS_SOUTH\n"));
966 //PrintNtConsole("Found SIS_SOUTH\n");
967 break;
968 }
969 // Make some additional checks
970 KdPrint2((PRINT_PREFIX "ChipType == SIS_BASE\n"));
971 ChangePciConfig1(0x57, (a & 0x7f));
972 GetPciConfig4(0x00, tmp32);
973 if(tmp32 == ATA_SIS5518) {
974 ChipType = SIS133NEW;
975 deviceExtension->HwFlags = (deviceExtension->HwFlags & ~CHIPTYPE_MASK) | SIS133NEW;
976 deviceExtension->MaxTransferMode = ATA_UDMA6;
977 KdPrint2((PRINT_PREFIX "UniataChipDetect: SiS 962/963 DMA %#x controller\n", deviceExtension->MaxTransferMode));
978 //PrintNtConsole("UniataChipDetect: SiS 962/963 DMA %#x controller\n", deviceExtension->MaxTransferMode);
979 // Restore device ID
980 ChangePciConfig1(0x57, (a | 0x80));
981 } else {
982 static BUSMASTER_CONTROLLER_INFORMATION_BASE const SiSSouthAdapters[] = {
983 PCI_DEV_HW_SPEC_BM( 0008, 1039, 0x10, ATA_MODE_NOT_SPEC, "SiS 961", 0 ),
984// PCI_DEV_HW_SPEC_BM( 0008, 1039, 0x00, ATA_MODE_NOT_SPEC, "SiS 961", 0 ),
985 PCI_DEV_HW_SPEC_BM( ffff, ffff, 0xff, ATA_MODE_NOT_SPEC, NULL , -1 )
986 };
987 // Save settings
988 GetPciConfig1(0x4a, tmp8);
989 ChangePciConfig1(0x4a, (a | 0x10));
990 if(tmp32 == ATA_SIS5513 ||
991 tmp32 == ATA_SIS5517) {
993 -1, HwDeviceExtension, SystemIoBusNumber, PCISLOTNUM_NOT_SPECIFIED, NULL);
994 if(i != BMLIST_TERMINATOR) {
995 KdPrint2((PRINT_PREFIX "SIS South\n"));
996 deviceExtension->HwFlags = (deviceExtension->HwFlags & ~CHIPTYPE_MASK) | SIS133OLD;
997 deviceExtension->MaxTransferMode = ATA_UDMA6;
998 //deviceExtension->MaxTransferMode = SiSSouthAdapters[i].MaxTransferMode;
999 if(SiSSouthAdapters[i].RaidFlags & UNIATA_SATA) {
1000 KdPrint2((PRINT_PREFIX "SIS South SATA\n"));
1001 deviceExtension->HwFlags |= UNIATA_SATA;
1002 if(SiSSouthAdapters[i].nDeviceId == 0x1182 ||
1003 SiSSouthAdapters[i].nDeviceId == 0x1183) {
1004 KdPrint2((PRINT_PREFIX "SIS_182\n"));
1005 SIS_182 = TRUE;
1006 }
1007 }
1008 } else {
1009 // SiS-South not found
1010 if(tmp32 == ATA_SIS5517) {
1011 deviceExtension->HwFlags = (deviceExtension->HwFlags & ~CHIPTYPE_MASK) | SIS100NEW;
1012 deviceExtension->MaxTransferMode = ATA_UDMA5;
1013 } else {
1014 // generic SiS33
1015 KdPrint2((PRINT_PREFIX "Generic SiS DMA\n"));
1016 }
1017 }
1018 }
1019 // Restore settings
1020 SetPciConfig1(0x4a, tmp8);
1021 KdPrint2((PRINT_PREFIX "UniataChipDetect: SiS 961 DMA %#x controller\n", deviceExtension->MaxTransferMode));
1022 //PrintNtConsole("UniataChipDetect: SiS 961 DMA %#x controller\n", deviceExtension->MaxTransferMode);
1023 if(deviceExtension->HwFlags & UNIATA_SATA) {
1024 KdPrint2((PRINT_PREFIX "SiS SATA\n"));
1025
1026 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1027 5, 0, 0x400);
1028 KdPrint2((PRINT_PREFIX "BaseMemAddress %x\n", BaseMemAddress));
1029 if(BaseMemAddress) {
1030 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
1031 KdPrint2((PRINT_PREFIX "MemIo\n"));
1032 MemIo = TRUE;
1033 }
1034 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
1035
1036 for(c=0; c<deviceExtension->NumberChannels; c++) {
1037 ULONG offs = c << (SIS_182 ? 5 : 6);
1038
1039 chan = &deviceExtension->chan[c];
1040 UniataInitIoRes(chan, IDX_SATA_SStatus, BaseMemAddress + 0 + offs, MemIo, FALSE);
1041 UniataInitIoRes(chan, IDX_SATA_SError, BaseMemAddress + 4 + offs, MemIo, FALSE);
1042 UniataInitIoRes(chan, IDX_SATA_SControl, BaseMemAddress + 8 + offs, MemIo, FALSE);
1043
1044 chan->ChannelCtrlFlags |= CTRFLAGS_NO_SLAVE;
1045 }
1046 }
1047 }
1048 }
1049 //ChangePciConfig1(0x57, (a | 0x80));
1050 break; }
1051
1052 case ATA_VIA_ID: {
1053
1054 if(ChipFlags & VIASATA) {
1055 /* 2 SATA without SATA registers on first channel + 1 PATA on second */
1056 // do nothing, generic PATA INIT
1057 KdPrint2((PRINT_PREFIX "VIA SATA without SATA regs\n"));
1058 break;
1059 }
1060 if(ChipFlags & UNIATA_SATA) {
1061
1062 ULONG IoSize = 0;
1063 BaseMemAddress = 0;
1064
1065 switch(DeviceID) {
1066 case 0x3149: // VIA 6420
1067 KdPrint2((PRINT_PREFIX "VIA 6420\n"));
1068 IoSize = 0x80;
1069 break;
1070 case 0x3249: // VIA 6421
1071 KdPrint2((PRINT_PREFIX "VIA 6421\n"));
1072 IoSize = 0x40;
1073 break;
1074 }
1075 if(IoSize) {
1076 KdPrint2((PRINT_PREFIX "IoSize %x\n", IoSize));
1077 /*deviceExtension->*/BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1078 5, 0, IoSize * deviceExtension->NumberChannels);
1079 if(BaseMemAddress && (*ConfigInfo->AccessRanges)[5].RangeInMemory) {
1080 KdPrint2((PRINT_PREFIX "MemIo\n"));
1081 MemIo = TRUE;
1082 }
1083 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
1084 }
1085 if(/*deviceExtension->*/BaseMemAddress) {
1086 KdPrint2((PRINT_PREFIX "UniataChipDetect: BAR5 %x\n", /*deviceExtension->*/BaseMemAddress));
1087 if(ChipFlags & VIABAR) {
1088
1089 ULONG BaseIoAddressBM_0;
1090 ULONG BaseIo;
1091
1092 KdPrint2((PRINT_PREFIX "UniataChipDetect: VIABAR\n"));
1093 /*deviceExtension->*/BaseIoAddressBM_0 = /*(PIDE_BUSMASTER_REGISTERS)*/
1094 AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber, 4, 0,
1095 sizeof(IDE_BUSMASTER_REGISTERS)*deviceExtension->NumberChannels);
1096 deviceExtension->AltRegMap = TRUE; // inform generic resource allocator
1097 for(c=0; c<deviceExtension->NumberChannels; c++) {
1098
1099 chan = &deviceExtension->chan[c];
1100
1101 BaseIo = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber, c, 0, /*0x80*/ sizeof(IDE_REGISTERS_1) + sizeof(IDE_REGISTERS_2)*2);
1102
1103 for (i=0; i<=IDX_IO1_SZ; i++) {
1104 UniataInitIoRes(chan, IDX_IO1+i, BaseIo + i, FALSE, FALSE);
1105 }
1106 UniataInitIoRes(chan, IDX_IO2_AltStatus, BaseIo + sizeof(IDE_REGISTERS_1) + 2, FALSE, FALSE);
1108
1109 for (i=0; i<=IDX_BM_IO_SZ; i++) {
1110 UniataInitIoRes(chan, IDX_BM_IO+i, BaseIoAddressBM_0 + sizeof(IDE_BUSMASTER_REGISTERS)*c + i, FALSE, FALSE);
1111 }
1112
1113 }
1114 }
1115 for(c=0; c<deviceExtension->NumberChannels; c++) {
1116 chan = &deviceExtension->chan[c];
1117 if((ChipFlags & VIABAR) && (c==2)) {
1118 // Do not setup SATA registers for PATA part
1119 for (i=0; i<=IDX_SATA_IO_SZ; i++) {
1121 }
1122 break;
1123 }
1124 UniataInitIoRes(chan, IDX_SATA_SStatus, BaseMemAddress + (c * IoSize), MemIo, FALSE);
1125 UniataInitIoRes(chan, IDX_SATA_SError, BaseMemAddress + 4 + (c * IoSize), MemIo, FALSE);
1126 UniataInitIoRes(chan, IDX_SATA_SControl, BaseMemAddress + 8 + (c * IoSize), MemIo, FALSE);
1127
1129 }
1130
1131 }
1132 }
1133 break; }
1134 case ATA_INTEL_ID: {
1135
1136 if(!(ChipFlags & UNIATA_SATA)) {
1137 break;
1138 }
1139
1140 /* the intel 31244 needs special care if in DPA mode */
1141 if(DeviceID == 3200 && // Intel 31244
1142 pciData->SubClass != PCI_DEV_SUBCLASS_IDE) {
1143
1144 KdPrint2((PRINT_PREFIX "UniataChipDetect: Intel 31244, DPA mode\n"));
1145 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1146 0, 0, 0x0c00);
1147 if(!BaseMemAddress) {
1148 return STATUS_UNSUCCESSFUL;
1149 }
1150 if((*ConfigInfo->AccessRanges)[0].RangeInMemory) {
1151 KdPrint2((PRINT_PREFIX "MemIo\n"));
1152 MemIo = TRUE;
1153 }
1154 deviceExtension->AltRegMap = TRUE; // inform generic resource allocator
1155 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
1156
1157 for(c=0; c<deviceExtension->NumberChannels; c++) {
1158 ULONG offs = 0x200 + c*0x200;
1159
1160 chan = &deviceExtension->chan[c];
1161 for (i=0; i<=IDX_IO1_SZ; i++) {
1162 UniataInitIoRes(chan, IDX_BM_IO+i, BaseMemAddress + i*4 + offs, MemIo, FALSE);
1163 }
1164
1166
1167 UniataInitIoRes(chan, IDX_IO1_o_Command, BaseMemAddress + 0x1d + offs, MemIo, FALSE);
1168 UniataInitIoRes(chan, IDX_IO1_o_Feature, BaseMemAddress + 0x06 + offs, MemIo, FALSE);
1169 UniataInitIoRes(chan, IDX_IO2_o_Control, BaseMemAddress + 0x29 + offs, MemIo, FALSE);
1170
1171 UniataInitIoRes(chan, IDX_IO2_AltStatus, BaseMemAddress + 0x28 + offs, MemIo, FALSE);
1172
1173 UniataInitIoRes(chan, IDX_BM_Command, BaseMemAddress + 0x70 + offs, MemIo, FALSE);
1174 UniataInitIoRes(chan, IDX_BM_Status, BaseMemAddress + 0x72 + offs, MemIo, FALSE);
1175 UniataInitIoRes(chan, IDX_BM_PRD_Table, BaseMemAddress + 0x74 + offs, MemIo, FALSE);
1176
1177 UniataInitIoRes(chan, IDX_SATA_SStatus, BaseMemAddress + 0x100 + offs, MemIo, FALSE);
1178 UniataInitIoRes(chan, IDX_SATA_SError, BaseMemAddress + 0x104 + offs, MemIo, FALSE);
1179 UniataInitIoRes(chan, IDX_SATA_SControl, BaseMemAddress + 0x108 + offs, MemIo, FALSE);
1180
1182 }
1183
1184 break;
1185 }
1186 if(deviceExtension->MaxTransferMode >= ATA_SA150) {
1187
1188 BOOLEAN OrigAHCI = FALSE;
1189
1190 GetPciConfig1(0x90, tmp8);
1191 KdPrint2((PRINT_PREFIX "Intel chip config: %x\n", tmp8));
1192 /* SATA parts can be either compat or AHCI */
1193 MemIo = FALSE;
1194 if(ChipFlags & UNIATA_AHCI) {
1195 OrigAHCI = TRUE;
1196 if(tmp8 & 0xc0) {
1197 //KdPrint2((PRINT_PREFIX "AHCI not supported yet\n"));
1198 //return FALSE;
1199 KdPrint2((PRINT_PREFIX "try run AHCI\n"));
1200 if(ScsiPortConvertPhysicalAddressToUlong((*ConfigInfo->AccessRanges)[5].RangeStart)) {
1201 break;
1202 }
1203 KdPrint2((PRINT_PREFIX "No BAR5, try BM\n"));
1204 deviceExtension->HwFlags &= ~UNIATA_AHCI;
1205 }
1206 BaseIoAddressBM = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1207 4, 0, sizeof(IDE_BUSMASTER_REGISTERS));
1208 if(BaseIoAddressBM) {
1209 KdPrint2((PRINT_PREFIX "Intel BM check at %x\n", BaseIoAddressBM));
1210 /* check if we really have valid BM registers */
1211 if((*ConfigInfo->AccessRanges)[4].RangeInMemory) {
1212 KdPrint2((PRINT_PREFIX "MemIo[4]\n"));
1213 MemIo = TRUE;
1214 }
1215 UniataInitIoResEx(&deviceExtension->BaseIoAddressBM_0, BaseIoAddressBM, MemIo, FALSE);
1216
1217 tmp8 = AtapiReadPortEx1(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),IDX_BM_Status);
1218 KdPrint2((PRINT_PREFIX "BM status: %x\n", tmp8));
1219 /* cleanup */
1220 ScsiPortFreeDeviceBase(HwDeviceExtension, (PCHAR)(ULONG_PTR)BaseIoAddressBM);
1221 UniataInitIoResEx(&deviceExtension->BaseIoAddressBM_0, 0, 0, FALSE);
1222
1223 if(tmp8 == 0xff) {
1224 KdPrint2((PRINT_PREFIX "invalid BM status, keep AHCI mode\n"));
1225 break;
1226 }
1227 }
1228 KdPrint2((PRINT_PREFIX "Compatible mode, reallocate LUNs\n"));
1229 deviceExtension->NumberLuns = 2; // we may be in Legacy mode
1230 if(!UniataAllocateLunExt(deviceExtension, 2)) {
1231 KdPrint2((PRINT_PREFIX "can't re-allocate Luns\n"));
1232 return STATUS_UNSUCCESSFUL;
1233 }
1234 }
1235 deviceExtension->HwFlags &= ~UNIATA_AHCI;
1236
1237 MemIo = FALSE;
1238 /* if BAR(5) is IO it should point to SATA interface registers */
1239 if(OrigAHCI) {
1240 /* Skip BAR(5) in compatible mode */
1241 KdPrint2((PRINT_PREFIX "Ignore BAR5 on compatible\n"));
1242 BaseMemAddress = 0;
1243 } else
1244 if(deviceExtension->DevID == 0x28288086 &&
1245 pciData->u.type0.SubVendorID == 0x106b) {
1246 /* Skip BAR(5) on ICH8M Apples, system locks up on access. */
1247 KdPrint2((PRINT_PREFIX "Ignore BAR5 on ICH8M Apples\n"));
1248 BaseMemAddress = 0;
1249 } else {
1250 BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1251 5, 0, 0x10);
1252 if(BaseMemAddress && (*ConfigInfo->AccessRanges)[5].RangeInMemory) {
1253 KdPrint2((PRINT_PREFIX "MemIo[5]\n"));
1254 MemIo = TRUE;
1255 }
1256 }
1257 UniataInitIoResEx(&deviceExtension->BaseIoAddressSATA_0, BaseMemAddress, MemIo, FALSE);
1258
1259 for(c=0; c<deviceExtension->NumberChannels; c++) {
1260 chan = &deviceExtension->chan[c];
1261 AtapiSetupLunPtrs(chan, deviceExtension, c);
1262 IsPata = FALSE;
1263 if(ChipFlags & ICH5) {
1264 KdPrint2((PRINT_PREFIX "ICH5\n"));
1265 if ((tmp8 & 0x04) == 0) {
1267 } else if ((tmp8 & 0x02) == 0) {
1268 if(c != 0) {
1269 IsPata = TRUE;
1270 //chan->ChannelCtrlFlags |= CTRFLAGS_PATA;
1271 }
1272 } else if ((tmp8 & 0x02) != 0) {
1273 if(c != 1) {
1274 IsPata = TRUE;
1275 //chan->ChannelCtrlFlags |= CTRFLAGS_PATA;
1276 }
1277 }
1278 } else
1279 if(ChipFlags & I6CH2) {
1280 KdPrint2((PRINT_PREFIX "I6CH2\n"));
1282 } else {
1283 KdPrint2((PRINT_PREFIX "other Intel\n"));
1284 switch(tmp8 & 0x03) {
1285 case 2:
1286 if(c!=0) {
1287 // PATA
1288 IsPata = TRUE;
1289 }
1290 break;
1291 case 1:
1292 if(c!=1) {
1293 // PATA
1294 IsPata = TRUE;
1295 }
1296 break;
1297 }
1298 }
1299
1300 if(IsPata) {
1301 chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA5);
1302 KdPrint2((PRINT_PREFIX "PATA part\n"));
1303 } else {
1304
1305 if(!(ChipFlags & ICH7) && BaseMemAddress) {
1306 KdPrint2((PRINT_PREFIX "BaseMemAddress[5] -> indexed\n"));
1307 UniataInitIoRes(chan, IDX_INDEXED_ADDR, BaseMemAddress + 0, MemIo, FALSE);
1308 UniataInitIoRes(chan, IDX_INDEXED_DATA, BaseMemAddress + 4, MemIo, FALSE);
1309 }
1310 if((ChipFlags & ICH5) || BaseMemAddress) {
1311
1312 KdPrint2((PRINT_PREFIX "io proc()\n"));
1313 // Rather interesting way of register access...
1314 ChipType = INTEL_IDX;
1315 deviceExtension->HwFlags &= ~CHIPTYPE_MASK;
1316 deviceExtension->HwFlags |= ChipType;
1317
1318 if(ChipFlags & ICH7) {
1319 KdPrint2((PRINT_PREFIX "ICH7 way\n"));
1320 }
1321 UniataInitIoRes(chan, IDX_SATA_SStatus, 0x200*c + 0, FALSE, TRUE); // this is fake non-zero value
1322 UniataInitIoRes(chan, IDX_SATA_SError, 0x200*c + 2, FALSE, TRUE);
1323 UniataInitIoRes(chan, IDX_SATA_SControl, 0x200*c + 1, FALSE, TRUE);
1324 }
1325 }
1326
1327 } // end for()
1328
1329 // rest of INIT staff is in AtapiChipInit()
1330
1331 } // ATA_SA150
1332 break; }
1333 case ATA_CYRIX_ID:
1334 /* Cyrix 5530 ATA33 controller */
1335 if(deviceExtension->DevID == 0x01021078) {
1336 ConfigInfo->AlignmentMask = 0x0f;
1337 deviceExtension->MaximumDmaTransferLength = 63*1024;
1338 }
1339 break;
1340 case ATA_JMICRON_ID:
1341 /* New JMicron PATA/SATA controllers */
1342 GetPciConfig1(0xdf, tmp8);
1343 if(tmp8 & 0x40) {
1344 KdPrint((" Check JMicron AHCI\n"));
1345 if(Ata_is_ahci_dev(pciData)) {
1346 ChipFlags |= UNIATA_AHCI;
1347 deviceExtension->HwFlags |= UNIATA_AHCI;
1348 } else {
1349 KdPrint((" JMicron PATA/SATA\n"));
1350 }
1351 } else {
1352#if 0 // do not touch, see Linux sources
1353 /* set controller configuration to a combined setup we support */
1354 SetPciConfig4(0x40, 0x80c0a131);
1355 SetPciConfig4(0x80, 0x01200000);
1356#endif
1357 //GetPciConfig1(0x40, tmp32);
1358 KdPrint((" JMicron Combined\n"));
1359 //return STATUS_NOT_FOUND;
1360 }
1361 break;
1362 }
1363
1364 return STATUS_SUCCESS;
1365
1366} // end UniataChipDetect()
BUSMASTER_CONTROLLER_INFORMATION_BASE const BusMasterAdapters[]
Definition: bm_devs.h:40
#define UNIATA_SIMPLEX_ONLY
Definition: bm_devs_decl.h:624
#define ATA_VIACX700IDE
Definition: bm_devs_decl.h:595
#define NUM_BUSMASTER_ADAPTERS
Definition: bm_devs_decl.h:742
#define ATA_SIS5518
Definition: bm_devs_decl.h:526
#define SWKSMIO
Definition: bm_devs_decl.h:661
#define ATA_VIASATAIDE
Definition: bm_devs_decl.h:597
struct _BUSMASTER_CONTROLLER_INFORMATION_BASE * PBUSMASTER_CONTROLLER_INFORMATION_BASE
__inline ULONG Ata_is_dev_listed(IN PBUSMASTER_CONTROLLER_INFORMATION_BASE BusMasterAdapters, ULONG VendorId, ULONG DeviceId, ULONG RevId, ULONG lim)
Definition: bm_devs_decl.h:753
#define ATA_VIA82C571
Definition: bm_devs_decl.h:572
#define ATA_VIASATAIDE2
Definition: bm_devs_decl.h:599
#define PCI_DEV_HW_SPEC_BM(idhi, idlo, rev, mode, name, flags)
Definition: bm_devs_decl.h:734
#define ATA_SIS5517
Definition: bm_devs_decl.h:525
#define VIANEW
Definition: bm_devs_decl.h:701
#define PRCMBO
Definition: bm_devs_decl.h:653
#define SIIBUG
Definition: bm_devs_decl.h:672
#define PRSATA
Definition: bm_devs_decl.h:652
#define VIA33
Definition: bm_devs_decl.h:702
#define ATA_SIS5513
Definition: bm_devs_decl.h:524
#define VIA66
Definition: bm_devs_decl.h:703
#define VIASOUTH
Definition: bm_devs_decl.h:712
#define Ata_is_ahci_dev(pciData)
Definition: bm_devs_decl.h:781
#define SIS_BASE
Definition: bm_devs_decl.h:684
#define BMLIST_TERMINATOR
Definition: bm_devs_decl.h:738
#define ATA_VIASATAIDE3
Definition: bm_devs_decl.h:601
#define VIA100
Definition: bm_devs_decl.h:704
VOID NTAPI ScsiPortFreeDeviceBase(IN PVOID HwDeviceExtension, IN PVOID MappedAddress)
Definition: scsiport.c:553
#define IDX_INDEXED_ADDR
Definition: bsmaster.h:466
#define IDX_BM_IO
Definition: bsmaster.h:163
ULONG NTAPI AtapiFindListedDev(PBUSMASTER_CONTROLLER_INFORMATION_BASE BusMasterAdapters, ULONG lim, IN PVOID HwDeviceExtension, IN ULONG BusNumber, IN ULONG SlotNumber, OUT PCI_SLOT_NUMBER *_slotData)
#define IDX_SATA_SControl
Definition: bsmaster.h:459
#define IDX_SATA_IO_SZ
Definition: bsmaster.h:455
#define DMA_MODE_NONE
Definition: bsmaster.h:1706
#define IDX_SATA_IO
Definition: bsmaster.h:453
#define IDX_INDEXED_DATA
Definition: bsmaster.h:467
#define IDX_BM_IO_SZ
Definition: bsmaster.h:165
ULONGIO_PTR NTAPI AtapiGetIoRange(IN PVOID HwDeviceExtension, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN PPCI_COMMON_CONFIG pciData, IN ULONG SystemIoBusNumber, IN ULONG rid, IN ULONG offset, IN ULONG length)
Definition: id_probe.cpp:153
#define PCI_DEV_SUBCLASS_IDE
Definition: bsmaster.h:119
#define PCISLOTNUM_NOT_SPECIFIED
Definition: bsmaster.h:1452
#define IDX_SATA_SStatus
Definition: bsmaster.h:457
#define KdPrint(x)
Definition: env_spec_w32.h:288
BOOLEAN NTAPI UniataAllocateLunExt(PHW_DEVICE_EXTENSION deviceExtension, ULONG NewNumberChannels)
Definition: id_init.cpp:2901
VOID UniataInitIoRes(IN PHW_CHANNEL chan, IN ULONG idx, IN ULONG addr, IN BOOLEAN MemIo, IN BOOLEAN Proc)
Definition: id_init.cpp:2822
VOID NTAPI AtapiSetupLunPtrs(IN PHW_CHANNEL chan, IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG c)
Definition: id_init.cpp:2856
BOOLEAN NTAPI UniataChipDetectChannels(IN PVOID HwDeviceExtension, IN PPCI_COMMON_CONFIG pciData, IN ULONG DeviceNumber, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo)
Definition: id_init.cpp:58
VOID UniataInitIoResEx(IN PIORES IoRes, IN ULONG addr, IN BOOLEAN MemIo, IN BOOLEAN Proc)
Definition: id_init.cpp:2839
VOID NTAPI UniataInitSyncBaseIO(IN PHW_CHANNEL chan)
Definition: id_init.cpp:2812
BOOLEAN NTAPI UniataAhciDetect(IN PVOID HwDeviceExtension, IN PPCI_COMMON_CONFIG pciData, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo)
Definition: id_sata.cpp:890
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_NOT_FOUND
Definition: shellext.h:72
char * PCHAR
Definition: typedefs.h:51
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ATA_MODE_NOT_SPEC
Definition: atapi.h:341
#define IDX_IO2_AltStatus
Definition: atapi.h:225
#define IDX_IO1_o_Feature
Definition: atapi.h:209
#define ATA_UDMA4
Definition: atapi.h:332
#define IDX_IO1
Definition: atapi.h:194
#define IDX_IO1_o_Command
Definition: atapi.h:215
#define IDX_IO2_o_Control
Definition: atapi.h:231
#define IDX_IO1_SZ
Definition: atapi.h:195

Referenced by UniataFindBusMasterController().

◆ UniataChipDetectChannels()

BOOLEAN NTAPI UniataChipDetectChannels ( IN PVOID  HwDeviceExtension,
IN PPCI_COMMON_CONFIG  pciData,
IN ULONG  DeviceNumber,
IN PPORT_CONFIGURATION_INFORMATION  ConfigInfo 
)

Definition at line 58 of file id_init.cpp.

64{
65 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
66 //ULONG slotNumber = deviceExtension->slotNumber;
67 ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber;
68 ULONG VendorID = deviceExtension->DevID & 0xffff;
69 //ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
70 //ULONG RevID = deviceExtension->RevID;
71 ULONG ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK;
72 ULONG ChipFlags= deviceExtension->HwFlags & CHIPFLAG_MASK;
73 ULONG i,n;
74
75 KdPrint2((PRINT_PREFIX "UniataChipDetectChannels:\n" ));
76
77 deviceExtension->AHCI_PI_mask = 0;
78
79 if(ChipFlags & (UNIATA_SATA | UNIATA_AHCI)) {
80 if(!deviceExtension->NumberChannels) {
81 KdPrint2((PRINT_PREFIX "uninitialized SATA/AHCI port number -> 1\n"));
82 deviceExtension->NumberChannels = 1;
83 }
84 if(AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"IgnoreAhciPM", 1 /* DEBUG */)) {
85 KdPrint2((PRINT_PREFIX "SATA/AHCI w/o PM, max luns 1 or 2\n"));
86 deviceExtension->NumberLuns = 2; // we may be in Legacy mode
87 //chan->ChannelCtrlFlags |= CTRFLAGS_NO_SLAVE;
88 } else {
89 KdPrint2((PRINT_PREFIX "SATA/AHCI -> possible PM, max luns %d\n", SATA_MAX_PM_UNITS));
90 deviceExtension->NumberLuns = SATA_MAX_PM_UNITS;
91 //deviceExtension->NumberLuns = 1;
92 }
93 }
94 if(deviceExtension->MasterDev) {
95 KdPrint2((PRINT_PREFIX "MasterDev -> 1 chan\n"));
96 deviceExtension->NumberChannels = 1;
97 }
98 for(n=0; n<deviceExtension->NumberChannels; n++) {
99 if(AtapiRegCheckDevValue(deviceExtension, n, DEVNUM_NOT_SPECIFIED, L"Exclude", 0)) {
100 KdPrint2((PRINT_PREFIX "Channel %d excluded\n", n));
101 deviceExtension->AHCI_PI_mask &= ~((ULONG)1 << n);
102 } else {
103 deviceExtension->AHCI_PI_mask |= ((ULONG)1 << n);
104 }
105 }
106 KdPrint2((PRINT_PREFIX "PortMask %#x\n", deviceExtension->AHCI_PI_mask));
107 deviceExtension->AHCI_PI_mask =
108 AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"PortMask", (ULONG)0xffffffff >> (32-deviceExtension->NumberChannels) );
109 KdPrint2((PRINT_PREFIX "Force PortMask %#x\n", deviceExtension->AHCI_PI_mask));
110
111 for(i=deviceExtension->AHCI_PI_mask, n=0; i; n++, i=i>>1);
112 KdPrint2((PRINT_PREFIX "mask -> %d chans\n", n));
113
114 switch(VendorID) {
115 case ATA_ACER_LABS_ID:
116 switch(deviceExtension->DevID) {
117 case 0x528710b9:
118 case 0x528810b9:
119 deviceExtension->NumberChannels = 4;
120 KdPrint2((PRINT_PREFIX "Acer 4 chan\n"));
121 }
122 break;
123 case ATA_PROMISE_ID:
124
125 if(ChipType != PRMIO) {
126 break;
127 }
128 if(!(ChipFlags & UNIATA_SATA)) {
129 deviceExtension->NumberChannels = 4;
130 KdPrint2((PRINT_PREFIX "Promise up to 4 chan\n"));
131 } else
132 if(ChipFlags & PRCMBO) {
133 deviceExtension->NumberChannels = 3;
134 KdPrint2((PRINT_PREFIX "Promise 3 chan\n"));
135 } else {
136 deviceExtension->NumberChannels = 4;
137 KdPrint2((PRINT_PREFIX "Promise 4 chan\n"));
138 }
139 break;
140 case ATA_MARVELL_ID:
141 KdPrint2((PRINT_PREFIX "Marvell\n"));
142 /* AHCI part has own DevID-based workaround */
143 switch(deviceExtension->DevID) {
144 case 0x610111ab:
145 /* 88SX6101 only have 1 PATA channel */
146 if(BMList[deviceExtension->DevIndex].channel) {
147 KdPrint2((PRINT_PREFIX "88SX6101/11 has no 2nd PATA chan\n"));
148 return FALSE;
149 }
150 deviceExtension->NumberChannels = 1;
151 KdPrint2((PRINT_PREFIX "88SX6101 PATA 1 chan\n"));
152 break;
153 }
154 break;
155 case ATA_ATI_ID:
156 KdPrint2((PRINT_PREFIX "ATI\n"));
157 switch(deviceExtension->DevID) {
158 case ATA_ATI_IXP600:
159 KdPrint2((PRINT_PREFIX " IXP600\n"));
160 /* IXP600 only have 1 PATA channel */
161 if(BMList[deviceExtension->DevIndex].channel) {
162 KdPrint2((PRINT_PREFIX "New ATI no 2nd PATA chan\n"));
163 return FALSE;
164 }
165 deviceExtension->NumberChannels = 1;
166 KdPrint2((PRINT_PREFIX "New ATI PATA 1 chan\n"));
167 break;
168
169 case ATA_ATI_IXP700: {
170 UCHAR satacfg = 0;
171 PCI_SLOT_NUMBER slotData;
172 ULONG j, slotNumber;
173
174 KdPrint2((PRINT_PREFIX " IXP700\n"));
175 /*
176 * When "combined mode" is enabled, an additional PATA channel is
177 * emulated with two SATA ports and appears on this device.
178 * This mode can only be detected via SMB controller.
179 */
180 j = AtapiFindListedDev((BUSMASTER_CONTROLLER_INFORMATION_BASE*)&AtiSouthAdapters[0], -1, HwDeviceExtension, SystemIoBusNumber, PCISLOTNUM_NOT_SPECIFIED, &slotData);
181 if(j != BMLIST_TERMINATOR) {
182 slotNumber = slotData.u.AsULONG;
183
184 GetPciConfig1(0xad, satacfg);
185 KdPrint(("SATA controller %s (%s%s channel)\n",
186 (satacfg & 0x01) == 0 ? "disabled" : "enabled",
187 (satacfg & 0x08) == 0 ? "" : "combined mode, ",
188 (satacfg & 0x10) == 0 ? "primary" : "secondary"));
189 /*
190 * If SATA controller is enabled but combined mode is disabled,
191 * we have only one PATA channel. Ignore a non-existent channel.
192 */
193 if ((satacfg & 0x09) == 0x01) {
194 if(BMList[deviceExtension->DevIndex].channel) {
195 KdPrint2((PRINT_PREFIX "New ATI no 2nd PATA chan\n"));
196 return FALSE;
197 }
198 deviceExtension->NumberChannels = 1;
199 KdPrint2((PRINT_PREFIX "New ATI PATA 1 chan\n"));
200 break;
201 } else {
202 KdPrint2((PRINT_PREFIX "New ATI 2 chan\n"));
203 deviceExtension->NumberChannels = 2;
204 /*
205 if (BMList[deviceExtension->DevIndex].channel != ((satacfg & 0x10) >> 4)) {
206 ;
207 }
208 */
209
210 }
211 }
212
213 break; }
214 }
215 /* FALLTHROUGH */
217
218 if(ChipFlags & SIIBUG) {
219 /* work around errata in early chips */
220 deviceExtension->DmaSegmentLength = 15 * DEV_BSIZE;
221 deviceExtension->DmaSegmentAlignmentMask = 8192-1;
222 }
223 if(ChipType != SIIMIO) {
224 break;
225 }
226 if(!pciData) {
227 break;
228 }
229
230 if(VendorID == ATA_SILICON_IMAGE_ID) {
231 KdPrint2((PRINT_PREFIX "New SII\n"));
232 } else {
233 KdPrint2((PRINT_PREFIX "ATI SATA\n"));
234 }
235 if(deviceExtension->HwFlags & SII4CH) {
236 deviceExtension->NumberChannels = 4;
237 KdPrint2((PRINT_PREFIX "4 chan\n"));
238 }
239 break;
240 case ATA_VIA_ID:
241 if(/*(deviceExtension->DevID == 0x32491106) &&
242 ScsiPortConvertPhysicalAddressToUlong((*ConfigInfo->AccessRanges)[5].RangeStart)*/
243 deviceExtension->HwFlags & VIABAR) {
244 deviceExtension->NumberChannels = 3;
245 KdPrint2((PRINT_PREFIX "VIA 3 chan\n"));
246 }
247 if(ChipFlags & VIASATA) {
248 /* 2 SATA without SATA registers on first channel + 1 PATA on second */
249 // do nothing, generic PATA INIT
250 KdPrint2((PRINT_PREFIX "VIA SATA without SATA regs -> no PM\n"));
251 deviceExtension->NumberLuns = 1;
252 }
253 break;
254 case ATA_ITE_ID:
255 /* ITE ATA133 controller */
256 if(deviceExtension->DevID == 0x82131283) {
257 if(BMList[deviceExtension->DevIndex].channel) {
258 KdPrint2((PRINT_PREFIX "New ITE has no 2nd PATA chan\n"));
259 return FALSE;
260 }
261 deviceExtension->NumberChannels = 1;
262 KdPrint2((PRINT_PREFIX "New ITE PATA 1 chan\n"));
263 }
264 break;
265#if 0
266 case ATA_INTEL_ID:
267 /* New Intel PATA controllers */
269 /*deviceExtension->DevID == 0x27df8086 ||
270 deviceExtension->DevID == 0x269e8086 ||
271 deviceExtension->DevID == ATA_I82801HBM*/
272 ChipFlags & I1CH) {
273 if(BMList[deviceExtension->DevIndex].channel) {
274 KdPrint2((PRINT_PREFIX "New Intel PATA has no 2nd chan\n"));
275 return FALSE;
276 }
277 deviceExtension->NumberChannels = 1;
278 KdPrint2((PRINT_PREFIX "New Intel PATA 1 chan\n"));
279 }
280 break;
281#endif // this code is removed from newer FreeBSD
282#if 0
283 case ATA_JMICRON_ID:
284 /* New JMicron PATA controllers */
285 if(deviceExtension->DevID == ATA_JMB361 ||
286 deviceExtension->DevID == ATA_JMB363 ||
287 deviceExtension->DevID == ATA_JMB365 ||
288 deviceExtension->DevID == ATA_JMB366 ||
289 deviceExtension->DevID == ATA_JMB368) {
290
291 ULONG tmp32, port_mask;
292
293 port_mask = BMList[deviceExtension->DevIndex].channel;
294
295 GetPciConfig4(0x40, tmp32);
296
297 deviceExtension->NumberChannels = 2;
298 //KdPrint2((PRINT_PREFIX "New JMicron PATA 1 chan\n"));
299 }
300 break;
301#endif // this code is unnecessary since port mapping is implemented
302 case ATA_CYRIX_ID:
303 if(ChipType == CYRIX_OLD) {
304 UCHAR tmp8;
305 ULONG slotNumber;
306 slotNumber = deviceExtension->slotNumber;
307 KdPrint2((PRINT_PREFIX "Cyrix slot %#x\n", slotNumber));
308 GetPciConfig1(0x60, tmp8);
309 if(tmp8 & (1 << BMList[deviceExtension->DevIndex].channel)) {
310 KdPrint2((PRINT_PREFIX "Old Cyrix chan %d ok\n", BMList[deviceExtension->DevIndex].channel));
311 } else {
312 KdPrint2((PRINT_PREFIX "Old Cyrix no chan %d\n", BMList[deviceExtension->DevIndex].channel));
313 return FALSE;
314 }
315 }
316 break;
317 } // end switch(VendorID)
318
319 i = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"NumberChannels", n);
320 if(!i) {
321 i = n;
322 }
323 KdPrint2((PRINT_PREFIX "reg -> %d chans\n", n));
324
325 deviceExtension->NumberChannels = min(i, deviceExtension->NumberChannels);
326 if(!deviceExtension->NumberChannels) {
327 KdPrint2((PRINT_PREFIX "all channels blocked\n", n));
328 return FALSE;
329 }
330 deviceExtension->AHCI_PI_mask &= (ULONG)0xffffffff >> (32-deviceExtension->NumberChannels);
331 KdPrint2((PRINT_PREFIX "Final PortMask %#x\n", deviceExtension->AHCI_PI_mask));
332
333 return TRUE;
334
335} // end UniataChipDetectChannels()
#define ATA_ATI_IXP600
Definition: bm_devs_decl.h:154
#define ATA_ATI_IXP700
Definition: bm_devs_decl.h:156
ULONG g_opt_VirtualMachine
Definition: id_ata.cpp:105
#define SATA_MAX_PM_UNITS
Definition: bsmaster.h:110
#define VM_VBOX
Definition: bsmaster.h:1903
GLdouble n
Definition: glext.h:7729
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
static BUSMASTER_CONTROLLER_INFORMATION_BASE const AtiSouthAdapters[]
Definition: id_init.cpp:50

Referenced by UniataChipDetect().

◆ UniataClaimLegacyPCIIDE()

NTSTATUS NTAPI UniataClaimLegacyPCIIDE ( ULONG  i)

Definition at line 1939 of file id_probe.cpp.

1942{
1944 PCM_RESOURCE_LIST resourceList = NULL;
1945 UNICODE_STRING devname;
1946#ifdef __REACTOS__
1947 PCM_RESOURCE_LIST oldResList = NULL;
1948#endif
1949
1950 KdPrint2((PRINT_PREFIX "UniataClaimLegacyPCIIDE:\n"));
1951
1952 if(BMList[i].PciIdeDevObj) {
1953 KdPrint2((PRINT_PREFIX "Already initialized\n"));
1954 return STATUS_UNSUCCESSFUL;
1955 }
1956
1957 RtlInitUnicodeString(&devname, L"\\Device\\uniata_PCIIDE");
1959 /*NULL*/ &devname, FILE_DEVICE_UNKNOWN,
1960 0, FALSE, &(BMList[i].PciIdeDevObj));
1961
1962 if(!NT_SUCCESS(status)) {
1963 KdPrint2((PRINT_PREFIX "IoCreateDevice failed %#x\n", status));
1964 return status;
1965 }
1966
1968 sizeof(CM_RESOURCE_LIST));
1969
1970 if (!resourceList) {
1971 KdPrint2((PRINT_PREFIX "!resourceList\n"));
1973del_do:
1974 IoDeleteDevice(BMList[i].PciIdeDevObj);
1976#ifdef __REACTOS__
1977 if (oldResList)
1978 ExFreePool(oldResList);
1979#endif
1980 return status;
1981 }
1982
1984 resourceList,
1985 sizeof(CM_RESOURCE_LIST));
1986
1987#ifdef __REACTOS__
1988 oldResList = resourceList;
1989#endif
1990
1991 // IoReportDetectedDevice() should be used for WDM OSes
1992
1993 // TODO: check if resourceList is actually used inside HalAssignSlotResources()
1994 // Note: with empty resourceList call to HalAssignSlotResources() fails on some HW
1995 // e.g. Intel ICH4, but works with non-empty.
1996
1997 resourceList->Count = 1;
1998 resourceList->List[0].InterfaceType = PCIBus;
1999 resourceList->List[0].BusNumber = BMList[i].busNumber;
2000 // we do not report IO ranges since they are used/claimed by ISA part(s)
2001 resourceList->List[0].PartialResourceList.Count = 0;
2002
2003 RtlInitUnicodeString(&devname, L"PCIIDE");
2005 &devname,
2007 BMList[i].PciIdeDevObj,
2008 PCIBus,
2009 BMList[i].busNumber,
2010 BMList[i].slotNumber,
2011 &resourceList);
2012
2013 if (!NT_SUCCESS(status)) {
2014 KdPrint2((PRINT_PREFIX "HalAssignSlotResources failed %#x\n", status));
2015 // this is always deallocated inside HalAssignSlotResources() implementation
2016 //ExFreePool(resourceList);
2017 goto del_do;
2018 }
2019
2020#ifdef __REACTOS__
2021 ExFreePool(resourceList);
2022 ExFreePool(oldResList);
2023#endif
2024
2025 KdPrint2((PRINT_PREFIX "ok %#x\n", status));
2026 BMList[i].ChanInitOk |= 0x80;
2027
2028 return status;
2029} // end UniataClaimLegacyPCIIDE()
LONG NTSTATUS
Definition: precomp.h:26
UNICODE_STRING SavedRegPath
Definition: id_ata.cpp:69
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTHALAPI NTSTATUS NTAPI HalAssignSlotResources(PUNICODE_STRING, PUNICODE_STRING, PDRIVER_OBJECT, PDEVICE_OBJECT, INTERFACE_TYPE, ULONG, ULONG, PCM_RESOURCE_LIST *)
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define PagedPool
Definition: env_spec_w32.h:308
PDRIVER_OBJECT SavedDriverObject
Definition: id_probe.cpp:69
PBUSMASTER_CONTROLLER_INFORMATION BMList
Definition: id_probe.cpp:53
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define FILE_DEVICE_UNKNOWN
Definition: winioctl.h:79
struct _CM_RESOURCE_LIST * PCM_RESOURCE_LIST
CM_PARTIAL_RESOURCE_LIST PartialResourceList
Definition: restypes.h:144
INTERFACE_TYPE InterfaceType
Definition: restypes.h:142
CM_FULL_RESOURCE_DESCRIPTOR List[1]
Definition: restypes.h:149
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158

Referenced by DriverEntry().

◆ UniataConnectIntr2()

NTSTATUS NTAPI UniataConnectIntr2 ( IN PVOID  HwDeviceExtension)

ForceSimplex

Definition at line 2050 of file id_probe.cpp.

2053{
2054 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
2055 ULONG i = deviceExtension->DevIndex;
2057 PISR2_DEVICE_EXTENSION Isr2DevExt;
2058 WCHAR devname_str[33];
2059 UNICODE_STRING devname;
2060
2061 KdPrint2((PRINT_PREFIX "Init ISR:\n"));
2062
2063 /*
2064 We MUST register 2nd ISR for multichannel controllers even for UP systems.
2065 This is needed for cases when
2066 multichannel controller generate interrupt while we are still in its ISR for
2067 other channle's interrupt. New interrupt must be detected and queued for
2068 further processing. If we do not do this, system will not route this
2069 interrupt to main ISR (since it is busy) and we shall get to infinite loop
2070 looking for interrupt handler.
2071 */
2072
2073 if(!deviceExtension->MasterDev && (deviceExtension->NumberChannels > 1) && // do not touch MasterDev
2074 !deviceExtension->simplexOnly && /* // this is unnecessary on simplex controllers
2075 !BMList[i].Isr2DevObj*/ // handle re-init under w2k+
2077 /*(CPU_num > 1) && // unnecessary for UP systems*/
2078 TRUE) {
2079 // Ok, continue...
2080 KdPrint2((PRINT_PREFIX "Multichannel native mode, go...\n"));
2081#ifndef UNIATA_USE_XXableInterrupts
2082 // If we raise IRQL to TIMER value, other interrupt cannot occure on the same CPU
2083/* if(KeNumberProcessors < 2) {
2084 KdPrint2((PRINT_PREFIX "Unnecessary (?), UP machine\n"));
2085 //return STATUS_SUCCESS;
2086 }*/
2087#endif //UNIATA_USE_XXableInterrupts
2088 } else {
2089 KdPrint2((PRINT_PREFIX "Unnecessary\n"));
2090 return STATUS_SUCCESS;
2091 }
2092
2093 if(BMList[i].Isr2DevObj) {
2094 KdPrint2((PRINT_PREFIX "Already initialized [%d] %#x\n", i, BMList[i].Isr2DevObj));
2095 return STATUS_SUCCESS;
2096 }
2097
2098 KdPrint2((PRINT_PREFIX "Create DO\n"));
2099
2100 devname.Length =
2101 _snwprintf(devname_str, sizeof(devname_str)/sizeof(WCHAR)-1,
2102 L"\\Device\\uniata%d_2ch", i);
2103 devname_str[devname.Length] = 0;
2104 devname.Length *= sizeof(WCHAR);
2105 devname.MaximumLength = devname.Length;
2106 devname.Buffer = devname_str;
2107
2108 KdPrint2((PRINT_PREFIX "DO name: len(%d, %d), %S\n", devname.Length, devname.MaximumLength, devname.Buffer));
2109
2111 /*NULL*/ &devname, FILE_DEVICE_UNKNOWN,
2112 0, FALSE, &(BMList[i].Isr2DevObj));
2113
2114 if(!NT_SUCCESS(status)) {
2115 KdPrint2((PRINT_PREFIX "IoCreateDevice failed %#x\n", status));
2116 return status;
2117 }
2118
2119 KdPrint2((PRINT_PREFIX "HalGetInterruptVector\n"));
2120 KdPrint2((PRINT_PREFIX " OrigAdapterInterfaceType=%d\n", deviceExtension->OrigAdapterInterfaceType));
2121 KdPrint2((PRINT_PREFIX " SystemIoBusNumber=%d\n", deviceExtension->SystemIoBusNumber));
2122 KdPrint2((PRINT_PREFIX " BusInterruptLevel=%d\n", deviceExtension->BusInterruptLevel));
2123 KdPrint2((PRINT_PREFIX " BusInterruptVector=%d\n", deviceExtension->BusInterruptVector));
2125 deviceExtension->OrigAdapterInterfaceType,
2126 deviceExtension->SystemIoBusNumber,
2127 deviceExtension->BusInterruptLevel,
2128 deviceExtension->BusInterruptVector,
2129 &(BMList[i].Isr2Irql),
2130 &(BMList[i].Isr2Affinity));
2131
2132 Isr2DevExt = (PISR2_DEVICE_EXTENSION)(BMList[i].Isr2DevObj->DeviceExtension);
2133 Isr2DevExt->HwDeviceExtension = deviceExtension;
2134 Isr2DevExt->DevIndex = i;
2135
2136 KdPrint2((PRINT_PREFIX "isr2_de %#x\n", Isr2DevExt));
2137 KdPrint2((PRINT_PREFIX "isr2_vector %#x\n", BMList[i].Isr2Vector));
2138 KdPrint2((PRINT_PREFIX "isr2_irql %#x\n", BMList[i].Isr2Irql));
2139 KdPrint2((PRINT_PREFIX "isr2_affinity %#x\n", BMList[i].Isr2Affinity));
2140
2141// deviceExtension->QueueNewIrql = BMList[i].Isr2Irql;
2142
2143 KdPrint2((PRINT_PREFIX "IoConnectInterrupt\n"));
2145 &(BMList[i].Isr2InterruptObject),
2147 Isr2DevExt,
2148 NULL,
2149 BMList[i].Isr2Vector,
2150 BMList[i].Isr2Irql,
2151 BMList[i].Isr2Irql,
2152 (KINTERRUPT_MODE)(deviceExtension->InterruptMode),
2153 TRUE,
2155 FALSE);
2156
2157 if(!NT_SUCCESS(status)) {
2158 KdPrint2((PRINT_PREFIX "IoConnectInterrupt failed\n"));
2159 IoDeleteDevice(BMList[i].Isr2DevObj);
2162 return status;
2163 }
2164
2165 //deviceExtension->Isr2DevObj = BMList[i].Isr2DevObj;
2166
2167 return status;
2168} // end UniataConnectIntr2()
BOOLEAN NTAPI AtapiInterrupt2(IN PKINTERRUPT Interrupt, IN PVOID HwDeviceExtension)
Definition: id_ata.cpp:4192
NTHALAPI ULONG NTAPI HalGetInterruptVector(INTERFACE_TYPE, ULONG, ULONG, ULONG, PKIRQL, PKAFFINITY)
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
NTSTATUS NTAPI IoConnectInterrupt(OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
Definition: irq.c:23
enum _KINTERRUPT_MODE KINTERRUPT_MODE
ULONG InterruptMode
Definition: atapi.c:47
USHORT MaximumLength
Definition: env_spec_w32.h:370

Referenced by AtapiAdapterControl().

◆ UniataDisconnectIntr2()

NTSTATUS NTAPI UniataDisconnectIntr2 ( IN PVOID  HwDeviceExtension)

Definition at line 2172 of file id_probe.cpp.

2175{
2176 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
2177 ULONG i = deviceExtension->DevIndex;
2178// NTSTATUS status;
2179
2180 KdPrint2((PRINT_PREFIX "Deinit ISR:\n"));
2181
2182 if(!BMList[i].Isr2DevObj) {
2183 KdPrint2((PRINT_PREFIX "Already uninitialized %#x\n"));
2184 return STATUS_SUCCESS;
2185 }
2186
2187 IoDisconnectInterrupt(BMList[i].Isr2InterruptObject);
2188
2190
2191 IoDeleteDevice(BMList[i].Isr2DevObj);
2192
2194 //deviceExtension->Isr2DevObj = NULL;
2195
2196 return STATUS_SUCCESS;
2197} // end UniataDisconnectIntr2()
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
Definition: irq.c:142

Referenced by AtapiAdapterControl().

◆ UniataEnableIoPCI()

USHORT NTAPI UniataEnableIoPCI ( IN ULONG  busNumber,
IN ULONG  slotNumber,
IN OUT PPCI_COMMON_CONFIG  pciData 
)

Definition at line 95 of file id_probe.cpp.

100{
101 ULONG i;
102 ULONG busDataRead;
103 USHORT CmdOrig;
104
105 // Enable Busmastering, IO-space and Mem-space
106 // Note: write to CONFIG *may* cause controller to interrupt (not handled yet)
107 // even if no bits are updated. Was observed on ICH7
108 KdPrint2((PRINT_PREFIX "Enabling Mem/Io spaces and busmastering...\n"));
109 KdPrint2((PRINT_PREFIX "Initial pciData.Command = %#x\n", pciData->Command));
110 for(i=0; i<3; i++) {
111 CmdOrig = pciData->Command;
112 switch(i) {
113 case 0:
114 KdPrint2((PRINT_PREFIX "PCI_ENABLE_IO_SPACE\n"));
115 pciData->Command |= PCI_ENABLE_IO_SPACE;
116 break;
117 case 1:
118 KdPrint2((PRINT_PREFIX "PCI_ENABLE_MEMORY_SPACE\n"));
119 pciData->Command |= PCI_ENABLE_MEMORY_SPACE;
120 break;
121 case 2:
122 KdPrint2((PRINT_PREFIX "PCI_ENABLE_BUS_MASTER\n"));
123 pciData->Command |= PCI_ENABLE_BUS_MASTER;
124 break;
125 }
126 if(CmdOrig == pciData->Command) {
127 continue;
128 }
129 HalSetBusDataByOffset( PCIConfiguration, busNumber, slotNumber,
130 &(pciData->Command),
132 sizeof(pciData->Command));
133
134 // reread config space
135 busDataRead = HalGetBusData(PCIConfiguration, busNumber, slotNumber,
136 pciData, PCI_COMMON_HDR_LENGTH);
137 if(busDataRead < PCI_COMMON_HDR_LENGTH) {
138 KdPrint2((PRINT_PREFIX "HalGetBusData() failed %#x\n", busDataRead));
139 break;
140 }
141 KdPrint2((PRINT_PREFIX "New pciData.Command = %#x\n", pciData->Command));
142 }
143 KdPrint2((PRINT_PREFIX "InterruptLine = %#x\n", pciData->u.type0.InterruptLine));
144 KdPrint2((PRINT_PREFIX "Final pciData.Command = %#x\n", pciData->Command));
145 return pciData->Command;
146} // end UniataEnableIoPCI()
ULONG NTAPI HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:123
#define PCI_ENABLE_IO_SPACE
Definition: iotypes.h:3618
#define PCI_ENABLE_MEMORY_SPACE
Definition: iotypes.h:3619

Referenced by AtapiChipInit(), UniataEnumBusMasterController__(), and UniataFindBusMasterController().

◆ UniataEnumBusMasterController()

VOID NTAPI UniataEnumBusMasterController ( IN PVOID  DriverObject,
PVOID  Argument2 
)

Definition at line 245 of file id_probe.cpp.

249{
251
252} // end UniataEnumBusMasterController()
ULONG NTAPI UniataEnumBusMasterController__()
Definition: id_probe.cpp:299

Referenced by DriverEntry().

◆ UniataFindBusMasterController()

ULONG NTAPI UniataFindBusMasterController ( IN PVOID  HwDeviceExtension,
IN PVOID  Context,
IN PVOID  BusInformation,
IN PCHAR  ArgumentString,
IN OUT PPORT_CONFIGURATION_INFORMATION  ConfigInfo,
OUT PBOOLEAN  Again 
)

Definition at line 988 of file id_probe.cpp.

996{
997 PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
998 PHW_CHANNEL chan = NULL;
999#ifndef UNIATA_CORE
1000 // this buffer must be global for UNIATA_CORE build
1001 PCI_COMMON_CONFIG pciData;
1002#endif //UNIATA_CORE
1003 ULONG slotNumber;
1004 ULONG busDataRead;
1005 ULONG SystemIoBusNumber;
1006/*
1007 UCHAR vendorString[5];
1008 UCHAR deviceString[5];
1009
1010 PUCHAR vendorStrPtr;
1011 PUCHAR deviceStrPtr;
1012*/
1013 UCHAR BaseClass;
1014 UCHAR SubClass;
1015 ULONG VendorID;
1017 ULONG RevID;
1018 ULONG dev_id;
1019 PCI_SLOT_NUMBER slotData;
1020
1021 ULONG i;
1022 ULONG channel;
1023 ULONG c = 0;
1024 PUCHAR ioSpace;
1025 UCHAR statusByte;
1026 ULONG bm_offset;
1027
1028// UCHAR tmp8;
1029// ULONG irq;
1030
1031 BOOLEAN found = FALSE;
1032 BOOLEAN MasterDev;
1033 BOOLEAN simplexOnly = FALSE;
1034#ifndef UNIATA_CORE
1035#ifdef UNIATA_INIT_ON_PROBE
1036 BOOLEAN skip_find_dev = FALSE;
1037#endif
1038#endif
1039 BOOLEAN AltInit = FALSE;
1040
1041 SCSI_PHYSICAL_ADDRESS IoBasePort1;
1042 SCSI_PHYSICAL_ADDRESS IoBasePort2;
1043
1044 PIDE_BUSMASTER_REGISTERS BaseIoAddressBM_0 = NULL;
1045 PIDE_REGISTERS_1 BaseIoAddress1[IDE_MAX_CHAN];
1046 PIDE_REGISTERS_2 BaseIoAddress2[IDE_MAX_CHAN];
1047
1048 RtlZeroMemory(&BaseIoAddress1, sizeof(BaseIoAddress1));
1049 RtlZeroMemory(&BaseIoAddress2, sizeof(BaseIoAddress2));
1050
1054
1055 if(!WinVer_WDM_Model) {
1056 *Again = FALSE;
1057 } else {
1058 *Again = TRUE;
1059 }
1060
1061 KdPrint2((PRINT_PREFIX "UniataFindBusMasterController: Context=%x, BMListLen=%d\n", Context, BMListLen));
1062
1063 KdPrint2((PRINT_PREFIX "ConfigInfo->Length %x\n", ConfigInfo->Length));
1064
1065 if(ForceSimplex) {
1066 KdPrint2((PRINT_PREFIX "ForceSimplex (1)\n"));
1067 simplexOnly = TRUE;
1068 }
1069
1070 if(ConfigInfo->AdapterInterfaceType == Isa) {
1071 KdPrint2((PRINT_PREFIX "AdapterInterfaceType: Isa\n"));
1072 }
1073 if(InDriverEntry) {
1074 i = PtrToUlong(Context);
1075 if(i & 0x80000000) {
1076 AltInit = TRUE;
1077 }
1078 i &= ~0x80000000;
1079 channel = BMList[i].channel;
1080 } else {
1081 channel = 0;
1082 for(i=0; i<BMListLen; i++) {
1083 if(BMList[i].slotNumber == ConfigInfo->SlotNumber &&
1084 BMList[i].busNumber == ConfigInfo->SystemIoBusNumber) {
1085 break;
1086 }
1087 }
1088 if(i >= BMListLen) {
1089 KdPrint2((PRINT_PREFIX "unexpected device arrival\n"));
1090 i = PtrToUlong(Context);
1091 if(FirstMasterOk) {
1092 channel = 1;
1093 }
1094 i &= ~0x80000000;
1095 if(i >= BMListLen) {
1096 KdPrint2((PRINT_PREFIX " => SP_RETURN_NOT_FOUND\n"));
1097 goto exit_notfound;
1098 }
1099 }
1100 BMList[i].channel = (UCHAR)channel;
1101 }
1102
1103 bm_offset = channel ? ATA_BM_OFFSET1 : 0;
1104
1105 KdPrint2((PRINT_PREFIX "bm_offset %x, channel %x \n", bm_offset, channel));
1106
1107 if (!deviceExtension) {
1108 KdPrint2((PRINT_PREFIX "!deviceExtension => SP_RETURN_ERROR\n"));
1109 return SP_RETURN_ERROR;
1110 }
1111 RtlZeroMemory(deviceExtension, sizeof(HW_DEVICE_EXTENSION));
1112/*
1113 vendorStrPtr = vendorString;
1114 deviceStrPtr = deviceString;
1115*/
1116 slotNumber = BMList[i].slotNumber;
1117 SystemIoBusNumber = BMList[i].busNumber;
1118
1119
1120 KdPrint2((PRINT_PREFIX "AdapterInterfaceType=%#x\n",ConfigInfo->AdapterInterfaceType));
1121 KdPrint2((PRINT_PREFIX "IoBusNumber=%#x\n",ConfigInfo->SystemIoBusNumber));
1122 KdPrint2((PRINT_PREFIX "slotNumber=%#x\n",slotNumber));
1123
1124 // this buffer must be global and already filled for UNIATA_CORE build
1125 busDataRead = HalGetBusData(
1126 //busDataRead = ScsiPortGetBusData(HwDeviceExtension,
1128 SystemIoBusNumber,
1129 slotNumber,
1130 &pciData,
1132
1133#ifndef UNIATA_CORE
1134 if (busDataRead < (ULONG)PCI_COMMON_HDR_LENGTH) {
1135 KdPrint2((PRINT_PREFIX "busDataRead < PCI_COMMON_HDR_LENGTH => SP_RETURN_ERROR\n"));
1136 goto exit_error;
1137 }
1138
1139 KdPrint2((PRINT_PREFIX "busDataRead\n"));
1140 if (pciData.VendorID == PCI_INVALID_VENDORID) {
1141 KdPrint2((PRINT_PREFIX "PCI_INVALID_VENDORID\n"));
1142 goto exit_error;
1143 }
1144#endif //UNIATA_CORE
1145
1146 VendorID = pciData.VendorID;
1147 DeviceID = pciData.DeviceID;
1148 BaseClass = pciData.BaseClass;
1149 SubClass = pciData.SubClass;
1150 RevID = pciData.RevisionID;
1151 dev_id = VendorID | (DeviceID << 16);
1152 slotData.u.AsULONG = slotNumber;
1153 KdPrint2((PRINT_PREFIX "DevId = %8.8X Class = %4.4X/%4.4X\n", dev_id, BaseClass, SubClass ));
1154
1155 deviceExtension->slotNumber = slotNumber;
1156 deviceExtension->SystemIoBusNumber = SystemIoBusNumber;
1157 deviceExtension->DevID = dev_id;
1158 deviceExtension->RevID = RevID;
1159 deviceExtension->NumberChannels = IDE_DEFAULT_MAX_CHAN; // default
1160 deviceExtension->NumberLuns = IDE_MAX_LUN_PER_CHAN; // default
1161 deviceExtension->DevIndex = i;
1162
1163 _snprintf(deviceExtension->Signature, sizeof(deviceExtension->Signature),
1164 "UATA%8.8x/%1.1x@%8.8x", dev_id, channel, slotNumber);
1165
1166 if(BaseClass != PCI_DEV_CLASS_STORAGE) {
1167 KdPrint2((PRINT_PREFIX "BaseClass != PCI_DEV_CLASS_STORAGE => SP_RETURN_NOT_FOUND\n"));
1168 goto exit_notfound;
1169 }
1170
1171 KdPrint2((PRINT_PREFIX "Storage Class\n"));
1172
1173 // look for known chipsets
1174 if(VendorID != BMList[i].nVendorId ||
1175 DeviceID != BMList[i].nDeviceId) {
1176 KdPrint2((PRINT_PREFIX "device not suitable\n"));
1177 goto exit_notfound;
1178 }
1179
1180 found = UniataCheckPCISubclass(BMList[i].Known, BMList[i].RaidFlags, SubClass);
1181 if(!found) {
1182 KdPrint2((PRINT_PREFIX "Subclass not supported\n"));
1183 goto exit_notfound;
1184 }
1185
1186 ConfigInfo->AlignmentMask = 0x00000003;
1187
1188 MasterDev = IsMasterDev(&pciData);
1189
1190 if(MasterDev) {
1191 KdPrint2((PRINT_PREFIX "MasterDev (1)\n"));
1192 deviceExtension->MasterDev = TRUE;
1193 KdPrint2((PRINT_PREFIX "Check exclude\n"));
1194 if(AtapiRegCheckDevValue(deviceExtension, channel, DEVNUM_NOT_SPECIFIED, L"Exclude", 0)) {
1195 KdPrint2((PRINT_PREFIX "Device excluded\n"));
1196 goto exit_notfound;
1197 }
1198 }
1199
1200 status = UniataChipDetect(HwDeviceExtension, &pciData, i, ConfigInfo, &simplexOnly);
1201 switch(status) {
1202 case STATUS_SUCCESS:
1203 found = TRUE;
1204 break;
1205 case STATUS_NOT_FOUND:
1206 found = FALSE;
1207 break;
1208 default:
1209 KdPrint2((PRINT_PREFIX "FAILED => SP_RETURN_ERROR\n"));
1210 goto exit_error;
1211 }
1212 KdPrint2((PRINT_PREFIX "ForceSimplex = %d\n", simplexOnly));
1213 KdPrint2((PRINT_PREFIX "HwFlags = %x\n (0)", deviceExtension->HwFlags));
1214 switch(dev_id) {
1215 /* additional checks for some supported chipsets */
1216 case 0xc6931080:
1217 if (SubClass != PCI_DEV_SUBCLASS_IDE) {
1218 KdPrint2((PRINT_PREFIX "0xc6931080, SubClass != PCI_DEV_SUBCLASS_IDE => found = FALSE\n"));
1219 found = FALSE;
1220 } else {
1221 found = FALSE;
1222 }
1223 break;
1224
1225 /* unknown chipsets, try generic DMA if it seems possible */
1226 default:
1227 if (found)
1228 break;
1229 KdPrint2((PRINT_PREFIX "Default device\n"));
1230 if(Ata_is_supported_dev(&pciData)) {
1231 KdPrint2((PRINT_PREFIX "Ata_is_supported_dev\n"));
1232 found = TRUE;
1233 } else
1234 if(deviceExtension->HwFlags & UNIATA_AHCI) {
1235 KdPrint2((PRINT_PREFIX "AHCI candidate\n"));
1236 found = TRUE;
1237 } else {
1238 KdPrint2((PRINT_PREFIX "!Ata_is_supported_dev => found = FALSE\n"));
1239 found = FALSE;
1240 }
1241 deviceExtension->UnknownDev = TRUE;
1242 break;
1243 }
1244
1245 KdPrint2((PRINT_PREFIX "HwFlags = %x\n (1)", deviceExtension->HwFlags));
1246 if(!found) {
1247 KdPrint2((PRINT_PREFIX "!found => SP_RETURN_NOT_FOUND\n"));
1248 goto exit_notfound;
1249 }
1250
1251 KdPrint2((PRINT_PREFIX "HwFlags = %x\n (2)", deviceExtension->HwFlags));
1252 KdPrint2((PRINT_PREFIX "found suitable device\n"));
1253
1254 /***********************************************************/
1255 /***********************************************************/
1256 /***********************************************************/
1257
1258 deviceExtension->UseDpc = TRUE;
1259#ifndef UNIATA_CORE
1260 if (g_Dump) {
1261 deviceExtension->DriverMustPoll = TRUE;
1262 deviceExtension->UseDpc = FALSE;
1263 deviceExtension->simplexOnly = TRUE;
1264 deviceExtension->HwFlags |= UNIATA_NO_DPC;
1265 }
1266#endif //UNIATA_CORE
1267 KdPrint2((PRINT_PREFIX "HwFlags = %x\n (3)", deviceExtension->HwFlags));
1268 if(deviceExtension->HwFlags & UNIATA_NO_DPC) {
1269 /* CMD 649, ROSB SWK33, ICH4 */
1270 KdPrint2((PRINT_PREFIX "UniataFindBusMasterController: UNIATA_NO_DPC (0)\n"));
1271 deviceExtension->UseDpc = FALSE;
1272 }
1273
1274 if(MasterDev) {
1275 if((WinVer_Id() <= WinVer_NT) && AltInit && FirstMasterOk) {
1276 // this is the 2nd attempt to init this controller by OUR driver
1277 KdPrint2((PRINT_PREFIX "Skip primary/secondary claiming checks\n"));
1278 } else {
1279 if((channel==0) && ConfigInfo->AtdiskPrimaryClaimed) {
1280 KdPrint2((PRINT_PREFIX "Error: Primary channel already claimed by another driver\n"));
1281 goto exit_notfound;
1282 }
1283 if((channel==1) && ConfigInfo->AtdiskSecondaryClaimed) {
1284 KdPrint2((PRINT_PREFIX "Error: Secondary channel already claimed by another driver\n"));
1285 goto exit_notfound;
1286 }
1287 }
1288 }
1289 if(deviceExtension->HwFlags & UNIATA_AHCI) {
1290 KdPrint2((PRINT_PREFIX " AHCI registers layout\n"));
1291 } else
1292 if(deviceExtension->AltRegMap) {
1293 KdPrint2((PRINT_PREFIX " Non-standard registers layout\n"));
1294 if(deviceExtension->HwFlags & UNIATA_SATA) {
1295 KdPrint2((PRINT_PREFIX "UNIATA_SATA -> IsBusMaster == TRUE\n"));
1296 if(!deviceExtension->BusMaster) {
1297 deviceExtension->BusMaster = DMA_MODE_BM;
1298 }
1299 }
1300 } else {
1301 deviceExtension->BusMaster = DMA_MODE_NONE;
1302
1303 if(WinVer_WDM_Model && !deviceExtension->UnknownDev) {
1304 UniataEnableIoPCI(ConfigInfo->SystemIoBusNumber, slotData.u.AsULONG, &pciData);
1305 }
1306 // validate Mem/Io ranges
1307 //no_ranges = TRUE;
1308 {
1309 ULONG j;
1310 for(j=0; j<PCI_TYPE0_ADDRESSES; j++) {
1311 if(pciData.u.type0.BaseAddresses[j] & ~0x7) {
1312 //no_ranges = FALSE;
1313 //break;
1314 KdPrint2((PRINT_PREFIX "Range %d = %#x\n", j, pciData.u.type0.BaseAddresses[j]));
1315 }
1316 }
1317 }
1318
1319 if(IsBusMaster(&pciData)) {
1320
1321 KdPrint2((PRINT_PREFIX "IsBusMaster == TRUE\n"));
1322 BaseIoAddressBM_0 = (PIDE_BUSMASTER_REGISTERS)
1323 (AtapiGetIoRange(HwDeviceExtension, ConfigInfo, &pciData, SystemIoBusNumber,
1324 4, bm_offset, MasterDev ? 0x08 : 0x10/*ATA_BMIOSIZE*/)/* - bm_offset*/); //range id
1325 if(BaseIoAddressBM_0) {
1326 UniataInitMapBM(deviceExtension,
1327 BaseIoAddressBM_0,
1328 (*ConfigInfo->AccessRanges)[4].RangeInMemory ? TRUE : FALSE);
1329 deviceExtension->BusMaster = DMA_MODE_BM;
1330 deviceExtension->BaseIoAddressBM_0.Addr = (ULONGIO_PTR)BaseIoAddressBM_0;
1331 if((*ConfigInfo->AccessRanges)[4].RangeInMemory) {
1332 deviceExtension->BaseIoAddressBM_0.MemIo = TRUE;
1333 }
1334 }
1335 KdPrint2((PRINT_PREFIX " BusMasterAddress (base): %#x\n", BaseIoAddressBM_0));
1336 }
1337
1338 if(!deviceExtension->BusMaster) {
1339 KdPrint2((PRINT_PREFIX " !BusMasterAddress -> PIO4\n"));
1340 deviceExtension->MaxTransferMode = ATA_PIO4;
1341 }
1342
1343 if(deviceExtension->BusMaster && !MasterDev) {
1344 KdPrint2((PRINT_PREFIX "IsBusMaster == TRUE && !MasterDev\n"));
1345 statusByte = AtapiReadPort1(&(deviceExtension->chan[0]), IDX_BM_Status);
1346 KdPrint2((PRINT_PREFIX " BM statusByte = %x\n", statusByte));
1347 if(statusByte == IDE_STATUS_WRONG) {
1348 KdPrint2((PRINT_PREFIX " invalid port ?\n"));
1349 deviceExtension->BusMaster = DMA_MODE_NONE;
1350/*
1351 if(BaseIoAddressBM_0) {
1352 ScsiPortFreeDeviceBase(HwDeviceExtension,
1353 BaseIoAddressBM_0);
1354 BaseIoAddressBM_0 = NULL;
1355 }
1356*/
1357 } else
1358 if(statusByte & BM_STATUS_SIMPLEX_ONLY) {
1359 KdPrint2((PRINT_PREFIX " BM_STATUS => simplexOnly\n"));
1360 simplexOnly = TRUE;
1361 }
1362 }
1363 }
1364
1365 /*
1366 * the Cypress chip is a mess, it contains two ATA functions, but
1367 * both channels are visible on the first one.
1368 * simply ignore the second function for now, as the right
1369 * solution (ignoring the second channel on the first function)
1370 * doesn't work with the crappy ATA interrupt setup on the alpha.
1371 */
1372 if (dev_id == 0xc6931080 && slotData.u.bits.FunctionNumber > 1) {
1373 KdPrint2((PRINT_PREFIX "dev_id == 0xc6931080 && FunctionNumber > 1 => exit_findbm\n"));
1374 goto exit_findbm;
1375 }
1376
1377 /* do extra chipset specific setups */
1378 AtapiReadChipConfig(HwDeviceExtension, i, CHAN_NOT_SPECIFIED);
1379 AtapiChipInit(HwDeviceExtension, i, CHAN_NOT_SPECIFIED_CHECK_CABLE);
1380
1381 simplexOnly |= deviceExtension->simplexOnly;
1382 deviceExtension->simplexOnly |= simplexOnly;
1383
1384 KdPrint2((PRINT_PREFIX "simplexOnly = %d (2)", simplexOnly));
1385
1386 //TODO: fix hang with UseDpc=TRUE in Simplex mode
1387 //deviceExtension->UseDpc = TRUE;
1388 if(simplexOnly) {
1389 KdPrint2((PRINT_PREFIX "simplexOnly => UseDpc = FALSE\n"));
1390 deviceExtension->UseDpc = FALSE;
1391 }
1392
1393 if(simplexOnly && MasterDev) {
1394 if(deviceExtension->NumberChannels < IDE_DEFAULT_MAX_CHAN) {
1395 KdPrint2((PRINT_PREFIX "set NumberChannels = %d\n", IDE_DEFAULT_MAX_CHAN));
1396 deviceExtension->NumberChannels = IDE_DEFAULT_MAX_CHAN;
1397 if(BaseIoAddressBM_0) {
1398 UniataInitMapBM(deviceExtension,
1399 BaseIoAddressBM_0,
1400 (*ConfigInfo->AccessRanges)[4].RangeInMemory ? TRUE : FALSE);
1401 }
1402 }
1403 }
1404 if((channel > 0) &&
1405 (deviceExtension->NumberChannels > 1)) {
1406 KdPrint2((PRINT_PREFIX "Error: channel > 0 && NumberChannels > 1\n"));
1407 goto exit_findbm;
1408 }
1409
1410 // Indicate number of buses.
1411 ConfigInfo->NumberOfBuses = (UCHAR)(deviceExtension->NumberChannels);
1412 if(!ConfigInfo->InitiatorBusId[0]) {
1413 ConfigInfo->InitiatorBusId[0] = (CHAR)(IoGetConfigurationInformation()->ScsiPortCount);
1414 KdPrint2((PRINT_PREFIX "set ConfigInfo->InitiatorBusId[0] = %#x\n", ConfigInfo->InitiatorBusId[0]));
1415 }
1416 // Indicate four devices can be attached to the adapter
1417 ConfigInfo->MaximumNumberOfTargets = (UCHAR)(deviceExtension->NumberLuns);
1418
1419 if (MasterDev) {
1420 KdPrint2((PRINT_PREFIX "MasterDev (2)\n"));
1421/*
1422 if((WinVer_Id() > WinVer_NT) ||
1423 (deviceExtension->NumberChannels > 1)) {
1424
1425 KdPrint2((PRINT_PREFIX "2 channels & 2 irq for 1 controller Win 2000+\n"));
1426
1427 if (ConfigInfo->AdapterInterfaceType == MicroChannel) {
1428 ConfigInfo->InterruptMode2 =
1429 ConfigInfo->InterruptMode = LevelSensitive;
1430 } else {
1431 ConfigInfo->InterruptMode2 =
1432 ConfigInfo->InterruptMode = Latched;
1433 }
1434 ConfigInfo->BusInterruptLevel = 14;
1435 ConfigInfo->BusInterruptLevel2 = 15;
1436 } else*/
1437 if(simplexOnly) {
1438
1439 KdPrint2((PRINT_PREFIX "2 channels & 2 irq for 1 controller\n"));
1440
1441 if (ConfigInfo->AdapterInterfaceType == MicroChannel) {
1442 ConfigInfo->InterruptMode2 =
1443 ConfigInfo->InterruptMode = LevelSensitive;
1444 } else {
1445 ConfigInfo->InterruptMode2 =
1446 ConfigInfo->InterruptMode = Latched;
1447 }
1448 ConfigInfo->BusInterruptLevel = 14;
1449 ConfigInfo->BusInterruptLevel2 = 15;
1450 } else {
1451 KdPrint2((PRINT_PREFIX "1 channels & 1 irq for 1 controller\n"));
1452 if (ConfigInfo->AdapterInterfaceType == MicroChannel) {
1453 ConfigInfo->InterruptMode = LevelSensitive;
1454 } else {
1455 ConfigInfo->InterruptMode = Latched;
1456 }
1457 ConfigInfo->BusInterruptLevel = (channel == 0 ? 14 : 15);
1458 }
1459 } else {
1460 KdPrint2((PRINT_PREFIX "!MasterDev\n"));
1461 ConfigInfo->SlotNumber = slotNumber;
1462 ConfigInfo->SystemIoBusNumber = SystemIoBusNumber;
1463 ConfigInfo->InterruptMode = LevelSensitive;
1464
1465 /* primary and secondary channels share the same interrupt */
1466 if(!ConfigInfo->BusInterruptVector ||
1467 (ConfigInfo->BusInterruptVector != pciData.u.type0.InterruptLine)) {
1468 KdPrint2((PRINT_PREFIX "patch irq line = %#x\n", pciData.u.type0.InterruptLine));
1469 ConfigInfo->BusInterruptVector = pciData.u.type0.InterruptLine; // set default value
1470 if(!ConfigInfo->BusInterruptVector) {
1471 KdPrint2((PRINT_PREFIX "patch irq line (2) = 10\n"));
1472 ConfigInfo->BusInterruptVector = 10;
1473 }
1474 }
1475 }
1476 ConfigInfo->MultipleRequestPerLu = TRUE;
1477 ConfigInfo->AutoRequestSense = TRUE;
1478 ConfigInfo->TaggedQueuing = TRUE;
1479
1480 if((WinVer_Id() >= WinVer_NT) ||
1481 (ConfigInfo->Length >= sizeof(_ConfigInfo->comm) + sizeof(_ConfigInfo->nt4))) {
1482 KdPrint2((PRINT_PREFIX "update ConfigInfo->nt4\n"));
1483 _ConfigInfo->nt4.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
1484 _ConfigInfo->nt4.SpecificLuExtensionSize = sizeof(HW_LU_EXTENSION);
1485 //if(deviceExtension->HwFlags & UNIATA_AHCI) {
1486 _ConfigInfo->nt4.SrbExtensionSize = sizeof(ATA_REQ);
1487 //} else {
1488 // _ConfigInfo->nt4.SrbExtensionSize = FIELD_OFFSET(ATA_REQ, dma_tab) + sizeof(BM_DMA_ENTRY)*ATA_DMA_ENTRIES;
1489 //}
1490 KdPrint2((PRINT_PREFIX "using AtaReq sz %x\n", _ConfigInfo->nt4.SrbExtensionSize));
1491 }
1492 if((WinVer_Id() > WinVer_2k) ||
1493 (ConfigInfo->Length >= sizeof(_ConfigInfo->comm) + sizeof(_ConfigInfo->nt4) + sizeof(_ConfigInfo->w2k))) {
1494 KdPrint2((PRINT_PREFIX "update ConfigInfo->w2k: 64bit %d\n",
1495 deviceExtension->Host64));
1496#ifdef USE_OWN_DMA
1497 // We need not set Dma64BitAddresses since we perform address translation manually.
1498#else
1499 _ConfigInfo->w2k.Dma64BitAddresses = deviceExtension->Host64;
1500#endif //USE_OWN_DMA
1501 _ConfigInfo->w2k.ResetTargetSupported = TRUE;
1502 _ConfigInfo->w2k.MaximumNumberOfLogicalUnits = (UCHAR)deviceExtension->NumberLuns;
1503 }
1504
1505 // Save the Interrupe Mode for later use
1506 deviceExtension->InterruptMode = ConfigInfo->InterruptMode;
1507 deviceExtension->BusInterruptLevel = ConfigInfo->BusInterruptLevel;
1508 deviceExtension->BusInterruptVector = ConfigInfo->BusInterruptVector;
1509 deviceExtension->Channel = channel;
1510 deviceExtension->DevIndex = i;
1511 deviceExtension->OrigAdapterInterfaceType
1512 = ConfigInfo->AdapterInterfaceType;
1513 deviceExtension->AlignmentMask = ConfigInfo->AlignmentMask;
1514 deviceExtension->AdapterInterfaceType = PCIBus;
1515
1516 KdPrint2((PRINT_PREFIX "chan[%d] InterruptMode: %d, Level %d, Level2 %d, Vector %d, Vector2 %d\n",
1517 channel,
1518 ConfigInfo->InterruptMode,
1519 ConfigInfo->BusInterruptLevel,
1520 ConfigInfo->BusInterruptLevel2,
1521 ConfigInfo->BusInterruptVector,
1522 ConfigInfo->BusInterruptVector2
1523 ));
1524
1525 found = FALSE;
1526
1527 if(deviceExtension->BusMaster) {
1528
1529 KdPrint2((PRINT_PREFIX "Reconstruct ConfigInfo\n"));
1530#ifdef USE_OWN_DMA
1531 ConfigInfo->NeedPhysicalAddresses = FALSE;
1532#else
1533 ConfigInfo->NeedPhysicalAddresses = TRUE;
1534#endif //USE_OWN_DMA
1535 if(!MasterDev) {
1536//#ifdef USE_OWN_DMA
1537// KdPrint2((PRINT_PREFIX "!MasterDev, own DMA\n"));
1538//#else
1539 KdPrint2((PRINT_PREFIX "set Dma32BitAddresses\n"));
1540 ConfigInfo->Dma32BitAddresses = TRUE;
1541//#endif //USE_OWN_DMA
1542 }
1543
1544 // thanks to Vitaliy Vorobyov aka deathsoft@yandex.ru for
1545 // better solution:
1546
1547 if(AltInit) {
1548 // I'm sorry, I have to do this
1549 // when Win doesn't
1550
1551 if(ConfigInfo->AdapterInterfaceType == Isa /*&&
1552// InDriverEntry*/) {
1553 KdPrint2((PRINT_PREFIX "AdapterInterfaceType Isa => PCIBus\n"));
1554 ConfigInfo->AdapterInterfaceType = PCIBus;
1555 }
1556 if(ConfigInfo->AdapterInterfaceType == PCIBus /*&&
1557// InDriverEntry*/) {
1558 KdPrint2((PRINT_PREFIX "AdapterInterfaceType PCIBus, update address\n"));
1559 ConfigInfo->SlotNumber = slotNumber;
1560 ConfigInfo->SystemIoBusNumber = SystemIoBusNumber;
1561 }
1562 }
1563
1564#ifndef USE_OWN_DMA
1565 ConfigInfo->Master = TRUE;
1566 ConfigInfo->DmaWidth = Width16Bits;
1567#endif //USE_OWN_DMA
1568 ConfigInfo->ScatterGather = TRUE;
1569 }
1570 ConfigInfo->MapBuffers = TRUE; // Need for PIO and OWN_DMA
1571 ConfigInfo->CachesData = TRUE;
1572
1573 KdPrint2((PRINT_PREFIX "BMList[i].channel %#x, NumberChannels %#x, channel %#x\n",BMList[i].channel, deviceExtension->NumberChannels, channel));
1574
1575 for (; channel < (BMList[i].channel + deviceExtension->NumberChannels); channel++, c++) {
1576
1577 KdPrint2((PRINT_PREFIX "de %#x, Channel %#x\n",deviceExtension, channel));
1578 //PrintNtConsole("de %#x, Channel %#x, nchan %#x\n",deviceExtension, channel, deviceExtension->NumberChannels);
1579 chan = &deviceExtension->chan[c];
1580
1581 KdPrint2((PRINT_PREFIX "chan = %#x\n", chan));
1582 //PrintNtConsole("chan = %#x, c=%#x\n", chan, c);
1583 AtapiSetupLunPtrs(chan, deviceExtension, c);
1584
1585 /* do extra channel-specific setups */
1586 AtapiReadChipConfig(HwDeviceExtension, i, channel);
1587 //AtapiChipInit(HwDeviceExtension, i, channel);
1588 if(deviceExtension->HwFlags & UNIATA_AHCI) {
1589 KdPrint2((PRINT_PREFIX " No more setup for AHCI channel\n"));
1590 } else
1591 if(deviceExtension->AltRegMap) {
1592 KdPrint2((PRINT_PREFIX " Non-standard registers layout\n"));
1593 } else {
1594 // Check if the range specified is not used by another driver
1595 if(MasterDev) {
1596 KdPrint2((PRINT_PREFIX "set AccessRanges\n"));
1597 (*ConfigInfo->AccessRanges)[channel * 2 + 0].RangeStart =
1599 (*ConfigInfo->AccessRanges)[channel * 2 + 0].RangeLength = ATA_IOSIZE;
1600
1601 (*ConfigInfo->AccessRanges)[channel * 2 + 1].RangeStart =
1603 (*ConfigInfo->AccessRanges)[channel * 2 + 1].RangeLength = ATA_ALTIOSIZE;
1604 } else
1605 if(AltInit &&
1606 !(*ConfigInfo->AccessRanges)[channel * 2 + 0].RangeStart.QuadPart &&
1607 !(*ConfigInfo->AccessRanges)[channel * 2 + 1].RangeStart.QuadPart) {
1608 KdPrint2((PRINT_PREFIX "cheat ScsiPort, sync real PCI and ConfigInfo IO ranges\n"));
1609 AtapiGetIoRange(HwDeviceExtension, ConfigInfo, &pciData, SystemIoBusNumber,
1610 channel * 2 + 0, 0, ATA_IOSIZE);
1611 AtapiGetIoRange(HwDeviceExtension, ConfigInfo, &pciData, SystemIoBusNumber,
1612 channel * 2 + 1, 0, ATA_ALTIOSIZE);
1613 }
1614
1615 IoBasePort1 = (*ConfigInfo->AccessRanges)[channel * 2 + 0].RangeStart;
1616 IoBasePort2 = (*ConfigInfo->AccessRanges)[channel * 2 + 1].RangeStart;
1617
1618 if(!MasterDev) {
1619 if(!IoBasePort1.QuadPart || !IoBasePort2.QuadPart) {
1620 KdPrint2((PRINT_PREFIX "ScsiPortValidateRange failed (1)\n"));
1621 continue;
1622 }
1623 }
1624
1625 if(!ScsiPortValidateRange(HwDeviceExtension,
1626 PCIBus /*ConfigInfo->AdapterInterfaceType*/,
1627 SystemIoBusNumber /*ConfigInfo->SystemIoBusNumber*/,
1628 IoBasePort1,
1629 ATA_IOSIZE,
1630 TRUE) ) {
1631 KdPrint2((PRINT_PREFIX "ScsiPortValidateRange failed (1)\n"));
1632 continue;
1633 }
1634
1635 if(!ScsiPortValidateRange(HwDeviceExtension,
1636 PCIBus /*ConfigInfo->AdapterInterfaceType*/,
1637 SystemIoBusNumber /*ConfigInfo->SystemIoBusNumber*/,
1638 IoBasePort2,
1640 TRUE) ) {
1641 KdPrint2((PRINT_PREFIX "ScsiPortValidateRange failed (2)\n"));
1642 continue;
1643 }
1644
1645 KdPrint2((PRINT_PREFIX "Getting IO ranges\n"));
1646
1647 // Ok, translate adresses to io-space
1648 if(ScsiPortConvertPhysicalAddressToUlong(IoBasePort2)) {
1649 if(!(MasterDev /* || USE_16_BIT */)) {
1650 KdPrint2((PRINT_PREFIX "!MasterDev mode\n"));
1652 ScsiPortConvertPhysicalAddressToUlong(IoBasePort2) + 2);
1653 }
1654 } else {
1655 KdPrint2((PRINT_PREFIX "use relative IoBasePort2\n"));
1658 }
1659
1660 // Get the system physical address for this IO range.
1661 ioSpace = (PUCHAR)ScsiPortGetDeviceBase(HwDeviceExtension,
1662 MasterDev ? ConfigInfo->AdapterInterfaceType : PCIBus /*ConfigInfo->AdapterInterfaceType*/,
1663 MasterDev ? ConfigInfo->SystemIoBusNumber : SystemIoBusNumber /*ConfigInfo->SystemIoBusNumber*/,
1664 IoBasePort1,
1665 ATA_IOSIZE,
1666 TRUE);
1667 KdPrint2((PRINT_PREFIX "IO range 1 %#x\n",ioSpace));
1668
1669 // Check if ioSpace accessible.
1670 if (!ioSpace) {
1671 KdPrint2((PRINT_PREFIX "!ioSpace\n"));
1672 continue;
1673 }
1674/*
1675 if(deviceExtension->BusMaster) {
1676 KdPrint2((PRINT_PREFIX "set BusMaster io-range in DO\n"));
1677 // bm_offset already includes (channel ? ATA_BM_OFFSET1 : 0)
1678 deviceExtension->BaseIoAddressBM[c] = (PIDE_BUSMASTER_REGISTERS)
1679 ((ULONG)(deviceExtension->BaseIoAddressBM_0) + bm_offset + (c ? ATA_BM_OFFSET1 : 0));
1680 }
1681*/
1682 //deviceExtension->BaseIoAddress1[c] = (PIDE_REGISTERS_1)(ioSpace);
1683 BaseIoAddress1[c] = (PIDE_REGISTERS_1)(ioSpace);
1684
1685 // Get the system physical address for the second IO range.
1686 ioSpace = (PUCHAR)ScsiPortGetDeviceBase(HwDeviceExtension,
1687 MasterDev ? ConfigInfo->AdapterInterfaceType : PCIBus /*ConfigInfo->AdapterInterfaceType*/,
1688 MasterDev ? ConfigInfo->SystemIoBusNumber : SystemIoBusNumber /*ConfigInfo->SystemIoBusNumber*/,
1689 IoBasePort2,
1691 TRUE);
1692 KdPrint2((PRINT_PREFIX "IO range 2 %#x\n",ioSpace));
1693
1694 BaseIoAddress2[c] = (PIDE_REGISTERS_2)(ioSpace);
1695 if(!ioSpace) {
1696 // Release all allocated resources
1697 KdPrint2((PRINT_PREFIX "!deviceExtension->BaseIoAddress2\n"));
1698 //ioSpace = (PUCHAR)BaseIoAddress1[c];
1699 // goto free_iospace_1;
1700 found = FALSE;
1701 goto exit_findbm;
1702 }
1703 UniataInitMapBase(chan, BaseIoAddress1[c], BaseIoAddress2[c]);
1704 }
1705 //ioSpace = (PUCHAR)(deviceExtension->BaseIoAddress1[c]);
1706
1711
1712 if(!(deviceExtension->HwFlags & UNIATA_AHCI)) {
1713#ifdef _DEBUG
1714 UniataDumpATARegs(chan);
1715#endif
1716
1717#ifndef UNIATA_CORE
1718#ifdef UNIATA_INIT_ON_PROBE
1719// if(deviceExtension->HwFlags & UNIATA_SATA) {
1720//#endif //UNIATA_INIT_ON_PROBE
1721 KdPrint2((PRINT_PREFIX "Check drive 0\n"));
1722 // Check master.
1723 SelectDrive(chan, 0);
1725 GetBaseStatus(chan, statusByte);
1726 skip_find_dev = FALSE;
1727 if(!(deviceExtension->HwFlags & UNIATA_NO_SLAVE) && (deviceExtension->NumberLuns > 1)) {
1728 if ((statusByte & 0xf8) == 0xf8 ||
1729 (statusByte == 0xa5)) {
1730 // Check slave.
1731 KdPrint2((PRINT_PREFIX "Check drive 1\n"));
1732 SelectDrive(chan, 1);
1734 GetBaseStatus(chan, statusByte);
1735 if ((statusByte & 0xf8) == 0xf8 ||
1736 (statusByte == 0xa5)) {
1737 // No controller at this base address.
1738 KdPrint2((PRINT_PREFIX "Empty channel\n"));
1739 skip_find_dev = TRUE;
1740 }
1741 }
1742 }
1743
1744 // Search for devices on this controller.
1745 if (!skip_find_dev &&
1746 FindDevices(HwDeviceExtension,
1747 0,
1748 c)) {
1749 KdPrint2((PRINT_PREFIX "Found some devices\n"));
1750 found = TRUE;
1751 } else {
1752 KdPrint2((PRINT_PREFIX "no devices\n"));
1753 /* KeBugCheckEx(0xc000000e,
1754 ScsiPortConvertPhysicalAddressToUlong(IoBasePort1),
1755 ScsiPortConvertPhysicalAddressToUlong(IoBasePort2),
1756 (ULONG)(deviceExtension->BaseIoAddressBM[c]), skip_find_dev);*/
1757 }
1758//#ifdef UNIATA_INIT_ON_PROBE
1759// }
1760#else //UNIATA_INIT_ON_PROBE
1761 KdPrint2((PRINT_PREFIX "clean IDE intr 0\n"));
1762
1763 SelectDrive(chan, 0);
1765 GetBaseStatus(chan, statusByte);
1766
1767 if(!(deviceExtension->HwFlags & UNIATA_NO_SLAVE) && (deviceExtension->NumberLuns > 1)) {
1768 KdPrint2((PRINT_PREFIX "clean IDE intr 1\n"));
1769
1770 SelectDrive(chan, 1);
1772 GetBaseStatus(chan, statusByte);
1773
1774 SelectDrive(chan, 0);
1775 }
1776
1777 statusByte = GetDmaStatus(deviceExtension, c);
1778 KdPrint2((PRINT_PREFIX " DMA status %#x\n", statusByte));
1779 if(statusByte & BM_STATUS_INTR) {
1780 // bullshit, we have DMA interrupt, but had never initiate DMA operation
1781 KdPrint2((PRINT_PREFIX " clear unexpected DMA intr\n"));
1782 AtapiDmaDone(deviceExtension, 0, c, NULL);
1783 GetBaseStatus(chan, statusByte);
1784 }
1785
1786#endif //UNIATA_INIT_ON_PROBE
1787 }
1788 found = TRUE;
1789
1790 chan->PrimaryAddress = FALSE;
1791 // Claim primary or secondary ATA IO range.
1792 if (MasterDev) {
1793 KdPrint2((PRINT_PREFIX "claim Compatible controller\n"));
1794 if (channel == 0) {
1795 KdPrint2((PRINT_PREFIX "claim Primary\n"));
1797 ConfigInfo->AtdiskPrimaryClaimed = TRUE;
1798 chan->PrimaryAddress = TRUE;
1799
1801
1802 } else
1803 if (channel == 1) {
1804 KdPrint2((PRINT_PREFIX "claim Secondary\n"));
1806 ConfigInfo->AtdiskSecondaryClaimed = TRUE;
1807
1809 }
1810 } else {
1811 if(chan->RegTranslation[IDX_IO1].Addr == IO_WD1 &&
1812 !chan->RegTranslation[IDX_IO1].MemIo) {
1813 KdPrint2((PRINT_PREFIX "claim Primary (PCI over ISA range)\n"));
1815 ConfigInfo->AtdiskPrimaryClaimed = TRUE;
1816 }
1817 if(chan->RegTranslation[IDX_IO1].Addr == IO_WD2 &&
1818 !chan->RegTranslation[IDX_IO1].MemIo) {
1819 KdPrint2((PRINT_PREFIX "claim Secondary (PCI over ISA range)\n"));
1821 ConfigInfo->AtdiskSecondaryClaimed = TRUE;
1822 }
1823 }
1824
1825 AtapiDmaAlloc(HwDeviceExtension, ConfigInfo, c);
1826#else //UNIATA_CORE
1827 }
1828 found = TRUE;
1829#endif //UNIATA_CORE
1830 } // end for(channel)
1831
1832exit_findbm:
1833
1834#ifndef UNIATA_CORE
1835 if(!found) {
1836 KdPrint2((PRINT_PREFIX "exit: !found\n"));
1837 if(BaseIoAddress1[0])
1838 ScsiPortFreeDeviceBase(HwDeviceExtension,
1839 BaseIoAddress1[0]);
1840 if(BaseIoAddress2[0])
1841 ScsiPortFreeDeviceBase(HwDeviceExtension,
1842 BaseIoAddress2[0]);
1843
1844 if(BaseIoAddress1[1])
1845 ScsiPortFreeDeviceBase(HwDeviceExtension,
1846 BaseIoAddress1[1]);
1847 if(BaseIoAddress2[1])
1848 ScsiPortFreeDeviceBase(HwDeviceExtension,
1849 BaseIoAddress2[1]);
1850
1851 if(BaseIoAddressBM_0)
1852 ScsiPortFreeDeviceBase(HwDeviceExtension,
1853 BaseIoAddressBM_0);
1854
1855 if(deviceExtension->BaseIoAHCI_0.Addr) {
1856 ScsiPortFreeDeviceBase(HwDeviceExtension,
1857 deviceExtension->BaseIoAHCI_0.pAddr);
1858 }
1859
1860 KdPrint2((PRINT_PREFIX "return SP_RETURN_NOT_FOUND\n"));
1861 goto exit_notfound;
1862 } else {
1863
1864 KdPrint2((PRINT_PREFIX "exit: init spinlock\n"));
1865 //KeInitializeSpinLock(&(deviceExtension->DpcSpinLock));
1866 deviceExtension->ActiveDpcChan =
1867 deviceExtension->FirstDpcChan = CHAN_NOT_SPECIFIED;
1868
1870
1871 KdPrint2((PRINT_PREFIX "MasterDev=%#x, NumberChannels=%#x, Isr2DevObj=%#x\n",
1872 MasterDev, deviceExtension->NumberChannels, BMList[i].Isr2DevObj));
1873
1874 // ConnectIntr2 should be moved to HwInitialize
1875 status = UniataConnectIntr2(HwDeviceExtension);
1876
1877 KdPrint2((PRINT_PREFIX "MasterDev=%#x, NumberChannels=%#x, Isr2DevObj=%#x\n",
1878 MasterDev, deviceExtension->NumberChannels, BMList[i].Isr2DevObj));
1879
1880 if(/*WinVer_WDM_Model &&*/ MasterDev) {
1881 KdPrint2((PRINT_PREFIX "do not tell system, that we know about PCI IO ranges\n"));
1882/* if(BaseIoAddressBM_0) {
1883 ScsiPortFreeDeviceBase(HwDeviceExtension,
1884 BaseIoAddressBM_0);
1885 }*/
1886 (*ConfigInfo->AccessRanges)[4].RangeStart = ScsiPortConvertUlongToPhysicalAddress(0);
1887 (*ConfigInfo->AccessRanges)[4].RangeLength = 0;
1888 (*ConfigInfo->AccessRanges)[5].RangeStart = ScsiPortConvertUlongToPhysicalAddress(0);
1889 (*ConfigInfo->AccessRanges)[5].RangeLength = 0;
1890 }
1891
1892 if(!NT_SUCCESS(status)) {
1893 KdPrint2((PRINT_PREFIX "failed\n"));
1894 found = FALSE;
1895 goto exit_findbm;
1896 }
1897
1898 KdPrint2((PRINT_PREFIX "final chan[%d] InterruptMode: %d, Level %d, Level2 %d, Vector %d, Vector2 %d\n",
1899 channel,
1900 ConfigInfo->InterruptMode,
1901 ConfigInfo->BusInterruptLevel,
1902 ConfigInfo->BusInterruptLevel2,
1903 ConfigInfo->BusInterruptVector,
1904 ConfigInfo->BusInterruptVector2
1905 ));
1906
1907
1908 }
1909#endif //UNIATA_CORE
1910
1911 KdPrint2((PRINT_PREFIX "return SP_RETURN_FOUND\n"));
1912 //PrintNtConsole("return SP_RETURN_FOUND, de %#x, c0.lun0 %#x\n", deviceExtension, deviceExtension->chan[0].lun[0]);
1913
1914 if(MasterDev) {
1915 KdPrint2((PRINT_PREFIX "Attempt %d of MasterDev ok\n", AltInit));
1917 }
1918
1919 ConfigInfo->NumberOfBuses++; // add virtual channel for communication port
1920 return SP_RETURN_FOUND;
1921
1922exit_error:
1923 UniataFreeLunExt(deviceExtension);
1924 return SP_RETURN_ERROR;
1925
1926exit_notfound:
1927 UniataFreeLunExt(deviceExtension);
1928 return SP_RETURN_NOT_FOUND;
1929
1930} // end UniataFindBusMasterController()
#define GetBaseStatus(BaseIoAddress, Status)
Definition: atapi.h:331
struct _IDE_REGISTERS_2 * PIDE_REGISTERS_2
struct _IDE_REGISTERS_1 * PIDE_REGISTERS_1
struct _HW_LU_EXTENSION HW_LU_EXTENSION
struct _HW_DEVICE_EXTENSION HW_DEVICE_EXTENSION
#define IDE_MAX_CHAN
Definition: bm_devs_decl.h:42
#define UNIATA_NO_SLAVE
Definition: bm_devs_decl.h:625
#define UNIATA_NO_DPC
Definition: bm_devs_decl.h:627
#define IDE_DEFAULT_MAX_CHAN
Definition: bm_devs_decl.h:43
#define Ata_is_supported_dev(pciData)
Definition: bm_devs_decl.h:777
BOOLEAN NTAPI ScsiPortValidateRange(IN PVOID HwDeviceExtension, IN INTERFACE_TYPE BusType, IN ULONG SystemIoBusNumber, IN SCSI_PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfBytes, IN BOOLEAN InIoSpace)
Definition: scsiport.c:1518
UCHAR NTAPI AtapiDmaDone(IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG lChannel, IN PSCSI_REQUEST_BLOCK Srb)
Definition: id_dma.cpp:685
BOOLEAN WinVer_WDM_Model
Definition: id_ata.cpp:112
NTSTATUS NTAPI UniataChipDetect(IN PVOID HwDeviceExtension, IN PPCI_COMMON_CONFIG pciData, IN ULONG DeviceNumber, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN BOOLEAN *simplexOnly)
Definition: id_init.cpp:339
#define IsMasterDev(pciData)
Definition: bsmaster.h:861
#define ATA_ALTOFFSET
Definition: bsmaster.h:87
#define ATA_BM_OFFSET1
Definition: bsmaster.h:85
VOID NTAPI AtapiSetupLunPtrs(IN PHW_CHANNEL chan, IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG c)
Definition: id_init.cpp:2856
#define ATA_PCCARD_ALTOFFSET
Definition: bsmaster.h:88
union _ATA_REQ ATA_REQ
struct _IDE_BUSMASTER_REGISTERS * PIDE_BUSMASTER_REGISTERS
#define BM_STATUS_SIMPLEX_ONLY
Definition: bsmaster.h:148
#define IsBusMaster(pciData)
Definition: bsmaster.h:853
VOID NTAPI AtapiDmaAlloc(IN PVOID HwDeviceExtension, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN ULONG lChannel)
Definition: id_dma.cpp:138
BOOLEAN g_Dump
Definition: id_ata.cpp:108
#define ATA_IOSIZE
Definition: bsmaster.h:86
#define PCI_DEV_CLASS_STORAGE
Definition: bsmaster.h:117
BOOLEAN NTAPI AtapiReadChipConfig(IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG channel)
Definition: id_init.cpp:1789
BOOLEAN InDriverEntry
Definition: id_ata.cpp:107
#define IO_WD2
Definition: bsmaster.h:79
#define ATA_ALTIOSIZE
Definition: bsmaster.h:89
VOID NTAPI UniataFreeLunExt(PHW_DEVICE_EXTENSION deviceExtension)
Definition: id_init.cpp:2966
BOOLEAN NTAPI AtapiChipInit(IN PVOID HwDeviceExtension, IN ULONG DeviceNumber, IN ULONG c)
Definition: id_init.cpp:1886
#define IO_WD1
Definition: bsmaster.h:78
ULONG ForceSimplex
Definition: id_ata.cpp:78
MMRESULT FindDevices()
Definition: utils.c:159
#define PtrToUlong(u)
Definition: config.h:107
#define SP_RETURN_ERROR
Definition: srb.h:523
#define SP_RETURN_FOUND
Definition: srb.h:522
#define SP_RETURN_NOT_FOUND
Definition: srb.h:521
struct _PORT_CONFIGURATION_INFORMATION_COMMON * PPORT_CONFIGURATION_INFORMATION_COMMON
#define DbgDumpRegTranslation(chan, idx)
Definition: tools.h:135
#define WinVer_2k
Definition: CrossNt.h:114
ULONG BMListLen
Definition: id_probe.cpp:54
BOOLEAN AtdiskSecondaryClaimed
Definition: id_probe.cpp:62
BOOLEAN NTAPI UniataCheckPCISubclass(BOOLEAN known, ULONG RaidFlags, UCHAR SubClass)
Definition: id_probe.cpp:256
NTSTATUS NTAPI UniataConnectIntr2(IN PVOID HwDeviceExtension)
Definition: id_probe.cpp:2050
ULONGIO_PTR NTAPI AtapiGetIoRange(IN PVOID HwDeviceExtension, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN PPCI_COMMON_CONFIG pciData, IN ULONG SystemIoBusNumber, IN ULONG rid, IN ULONG offset, IN ULONG length)
Definition: id_probe.cpp:153
BOOLEAN AtdiskPrimaryClaimed
Definition: id_probe.cpp:61
USHORT NTAPI UniataEnableIoPCI(IN ULONG busNumber, IN ULONG slotNumber, IN OUT PPCI_COMMON_CONFIG pciData)
Definition: id_probe.cpp:95
BOOLEAN FirstMasterOk
Definition: id_probe.cpp:58
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
Returns a pointer to the I/O manager's global configuration information structure.
Definition: iorsrce.c:998
@ MicroChannel
Definition: restypes.h:124
@ Isa
Definition: restypes.h:122
@ Latched
Definition: miniport.h:81
@ LevelSensitive
Definition: miniport.h:80
@ Width16Bits
Definition: miniport.h:106
BOOLEAN PrimaryAddress
Definition: bsmaster.h:1036
IORES RegTranslation[IDX_MAX_REG]
Definition: bsmaster.h:1127
BOOLEAN DriverMustPoll
Definition: atapi.c:111
INTERFACE_TYPE AdapterInterfaceType
Definition: bsmaster.h:1316
PVOID pAddr
Definition: bsmaster.h:1011
ULONG MemIo
Definition: bsmaster.h:1013
PORT_CONFIGURATION_INFORMATION comm
Definition: srb.h:137
PORT_CONFIGURATION_INFORMATION_2K w2k
Definition: srb.h:139
PORT_CONFIGURATION_INFORMATION_NT nt4
Definition: srb.h:138
VOID NTAPI UniataDumpATARegs(IN struct _HW_CHANNEL *chan)
#define IDX_IO2
Definition: atapi.h:222
VOID NTAPI UniataInitMapBase(IN struct _HW_CHANNEL *chan, IN PIDE_REGISTERS_1 BaseIoAddress1, IN PIDE_REGISTERS_2 BaseIoAddress2)
VOID NTAPI UniataInitMapBM(IN struct _HW_DEVICE_EXTENSION *deviceExtension, IN struct _IDE_BUSMASTER_REGISTERS *BaseIoAddressBM_0, IN BOOLEAN MemIo)
LONGLONG QuadPart
Definition: typedefs.h:114
#define PCI_INVALID_VENDORID
Definition: iotypes.h:3603
#define PCI_TYPE0_ADDRESSES
Definition: iotypes.h:3502
#define _snprintf
Definition: xmlstorage.h:200

Referenced by DriverEntry(), UniataFindCompatBusMasterController1(), and UniataFindCompatBusMasterController2().

◆ UniataFindCompatBusMasterController1()

ULONG NTAPI UniataFindCompatBusMasterController1 ( IN PVOID  HwDeviceExtension,
IN PVOID  Context,
IN PVOID  BusInformation,
IN PCHAR  ArgumentString,
IN OUT PPORT_CONFIGURATION_INFORMATION  ConfigInfo,
OUT PBOOLEAN  Again 
)

Definition at line 924 of file id_probe.cpp.

932{
934 HwDeviceExtension,
935 UlongToPtr(0x00000000),
937 ArgumentString,
938 ConfigInfo,
939 Again
940 );
941} // end UniataFindCompatBusMasterController1()
#define UlongToPtr(u)
Definition: config.h:106
ULONG NTAPI UniataFindBusMasterController(IN PVOID HwDeviceExtension, IN PVOID Context, IN PVOID BusInformation, IN PCHAR ArgumentString, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, OUT PBOOLEAN Again)
Definition: id_probe.cpp:988
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
Definition: wdfdevice.h:3921

Referenced by DriverEntry().

◆ UniataFindCompatBusMasterController2()

ULONG NTAPI UniataFindCompatBusMasterController2 ( IN PVOID  HwDeviceExtension,
IN PVOID  Context,
IN PVOID  BusInformation,
IN PCHAR  ArgumentString,
IN OUT PPORT_CONFIGURATION_INFORMATION  ConfigInfo,
OUT PBOOLEAN  Again 
)

Definition at line 945 of file id_probe.cpp.

953{
955 HwDeviceExtension,
956 UlongToPtr(0x80000000),
958 ArgumentString,
959 ConfigInfo,
960 Again
961 );
962} // end UniataFindCompatBusMasterController2()

Referenced by DriverEntry().

◆ UniataForgetDevice()

VOID NTAPI UniataForgetDevice ( PHW_LU_EXTENSION  LunExt)

Definition at line 2385 of file id_ata.cpp.

2388{
2389 // keep only DFLAGS_HIDDEN flag
2390 LunExt->DeviceFlags &= DFLAGS_HIDDEN;
2391 LunExt->AtapiReadyWaitDelay = 0;
2392} // end UniataForgetDevice()
ULONG AtapiReadyWaitDelay
Definition: bsmaster.h:1191
#define DFLAGS_HIDDEN
Definition: atapi.h:253

Referenced by AtapiResetController__(), AtapiStartIo__(), CheckDevice(), FindDevices(), IdeSendCommand(), UniataAhciReset(), UniataAnybodyHome(), and UniataSataEvent().

◆ UniataFreeLunExt()

VOID NTAPI UniataFreeLunExt ( PHW_DEVICE_EXTENSION  deviceExtension)

Definition at line 2966 of file id_init.cpp.

2969{
2970 if (deviceExtension->lun) {
2971 ExFreePool(deviceExtension->lun);
2972 deviceExtension->lun = NULL;
2973 }
2974 if (deviceExtension->chan) {
2975 ExFreePool(deviceExtension->chan);
2976 deviceExtension->chan = NULL;
2977 }
2978 if(deviceExtension->AhciInternalAtaReq0) {
2979 ExFreePool(deviceExtension->AhciInternalAtaReq0);
2980 deviceExtension->AhciInternalAtaReq0 = NULL;
2981 }
2982 if(deviceExtension->AhciInternalSrb0) {
2983 ExFreePool(deviceExtension->AhciInternalSrb0);
2984 deviceExtension->AhciInternalSrb0 = NULL;
2985 }
2986
2987 return;
2988} // end UniataFreeLunExt()

Referenced by AtapiFindIsaController(), and UniataAllocateLunExt().

Variable Documentation

◆ BMList

◆ BMListLen

◆ CPU_num

ULONG CPU_num
extern

Definition at line 113 of file id_ata.cpp.

Referenced by AtaSetTransferMode(), and DriverEntry().

◆ ForceSimplex

ULONG ForceSimplex
extern

Definition at line 78 of file id_ata.cpp.

Referenced by DriverEntry(), and UniataFindBusMasterController().

◆ g_Dump

◆ g_opt_AtapiDmaRawRead

BOOLEAN g_opt_AtapiDmaRawRead
extern

Definition at line 100 of file id_ata.cpp.

Referenced by AtapiReadChipConfig(), and DriverEntry().

◆ g_opt_Verbose

BOOLEAN g_opt_Verbose
extern

Definition at line 110 of file id_ata.cpp.

Referenced by DriverEntry().

◆ g_opt_VirtualMachine

◆ g_opt_WaitBusyResetCount

ULONG g_opt_WaitBusyResetCount
extern

Definition at line 89 of file id_ata.cpp.

Referenced by CheckDevice(), and DriverEntry().

◆ hasPCI

BOOLEAN hasPCI
extern

◆ InDriverEntry

BOOLEAN InDriverEntry
extern

Definition at line 107 of file id_ata.cpp.

Referenced by DriverEntry(), and UniataFindBusMasterController().

◆ IsaCount

ULONG IsaCount
extern

Definition at line 55 of file id_probe.cpp.

Referenced by AtapiFindIsaController(), and AtapiRegCheckDevValue().

◆ MCACount

ULONG MCACount
extern

Definition at line 56 of file id_probe.cpp.

Referenced by AtapiFindIsaController().

◆ pciBuffer

UCHAR pciBuffer[256]
extern

Definition at line 66 of file id_probe.cpp.

Referenced by AtapiFindController(), and FindBrokenController().

◆ SavedDriverObject

PDRIVER_OBJECT SavedDriverObject
extern

Definition at line 69 of file id_probe.cpp.

Referenced by DriverEntry(), UniataClaimLegacyPCIIDE(), and UniataConnectIntr2().

◆ SavedRegPath

UNICODE_STRING SavedRegPath
extern

Definition at line 69 of file id_ata.cpp.

Referenced by AtapiRegCheckParameterValue(), DriverEntry(), and UniataClaimLegacyPCIIDE().

◆ SkipRaids

ULONG SkipRaids
extern

Definition at line 77 of file id_ata.cpp.

Referenced by DriverEntry(), and UniataCheckPCISubclass().

◆ WinVer_WDM_Model

BOOLEAN WinVer_WDM_Model
extern

Definition at line 112 of file id_ata.cpp.

Referenced by AtapiHwInitialize(), DriverEntry(), and UniataFindBusMasterController().