diff --git a/reactos/drivers/storage/ide/uniata/id_ata.cpp b/reactos/drivers/storage/ide/uniata/id_ata.cpp index d58319d3110..47d4bde04f3 100644 --- a/reactos/drivers/storage/ide/uniata/id_ata.cpp +++ b/reactos/drivers/storage/ide/uniata/id_ata.cpp @@ -1692,7 +1692,7 @@ IssueIdentify( deviceExtension->FullIdentifyData.NVCache_Version )); - KdPrint2((PRINT_PREFIX "R-rate %#x\n", + KdPrint2((PRINT_PREFIX "R-rate %d\n", deviceExtension->FullIdentifyData.NominalMediaRotationRate )); @@ -5071,9 +5071,9 @@ continue_err: if(AtaReq->retry < MAX_RETRIES) { //fallback_pio: if(!(deviceExtension->HwFlags & UNIATA_AHCI)) { - AtaReq->Flags &= ~REQ_FLAG_DMA_OPERATION; + //AtaReq->Flags &= ~REQ_FLAG_DMA_OPERATION; + // Downrate will happen in AtapiDmaReinit(), try UDMA-2 for HDD only AtaReq->Flags |= REQ_FLAG_FORCE_DOWNRATE; -// LunExt->DeviceFlags |= DFLAGS_FORCE_DOWNRATE; } AtaReq->ReqState = REQ_STATE_QUEUED; goto reenqueue_req; @@ -5093,6 +5093,7 @@ continue_err: ((error >> 4) == SCSI_SENSE_HARDWARE_ERROR)) { if(AtaReq->retry < MAX_RETRIES) { //fallback_pio: + // Downrate will happen in AtapiDmaReinit(), use PIO immediately for ATAPI AtaReq->Flags &= ~REQ_FLAG_DMA_OPERATION; AtaReq->Flags |= REQ_FLAG_FORCE_DOWNRATE; // LunExt->DeviceFlags |= DFLAGS_FORCE_DOWNRATE; @@ -5449,6 +5450,7 @@ IntrPrepareResetController: chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_OPERATION; goto CompleteRequest; } +continue_read_drq: // Ensure that this is a read command. if (srb->SrbFlags & SRB_FLAGS_DATA_IN) { @@ -5489,7 +5491,6 @@ IntrPrepareResetController: } } } - } else { KdPrint2((PRINT_PREFIX "IdeIntr: Read %#x Dwords\n", wordCount/2)); @@ -5581,6 +5582,12 @@ IntrPrepareResetController: status = SRB_STATUS_SUCCESS; goto CompleteRequest; } + } else { + if(!atapiDev && !DataOverrun && (srb->SrbFlags & SRB_FLAGS_DATA_IN) && + (statusByte == (IDE_STATUS_IDLE | IDE_STATUS_DRQ))) { + KdPrint2((PRINT_PREFIX " HDD read data ready \n")); + goto continue_read_drq; + } } } @@ -6689,6 +6696,7 @@ IdeReadWrite( // Adjust buffer address and words left count. AtaReq->WordsLeft -= wordCount; AtaReq->DataBuffer += wordCount; + AtaReq->WordsTransfered += wordCount; // Wait for interrupt. return SRB_STATUS_PENDING; diff --git a/reactos/drivers/storage/ide/uniata/id_sata.cpp b/reactos/drivers/storage/ide/uniata/id_sata.cpp index 7d099e7e346..6e449ed77a3 100644 --- a/reactos/drivers/storage/ide/uniata/id_sata.cpp +++ b/reactos/drivers/storage/ide/uniata/id_sata.cpp @@ -968,6 +968,12 @@ UniataAhciDetect( KdPrint2((PRINT_PREFIX "\n")); /* get the number of HW channels */ + + /* CAP.NOP sometimes indicate the index of the last enabled + * port, at other times, that of the last possible port, so + * determining the maximum port number requires looking at + * both CAP.NOP and PI. + */ PI = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_PI); deviceExtension->AHCI_PI = PI; KdPrint2((PRINT_PREFIX " AHCI PI %#x\n", PI)); diff --git a/reactos/drivers/storage/ide/uniata/uniata_ver.h b/reactos/drivers/storage/ide/uniata/uniata_ver.h index e3d79e5b6a9..f7717c4a7d6 100644 --- a/reactos/drivers/storage/ide/uniata/uniata_ver.h +++ b/reactos/drivers/storage/ide/uniata/uniata_ver.h @@ -1,10 +1,10 @@ -#define UNIATA_VER_STR "45a8" -#define UNIATA_VER_DOT 0.45.1.8 +#define UNIATA_VER_STR "45b" +#define UNIATA_VER_DOT 0.45.2.0 #define UNIATA_VER_MJ 0 #define UNIATA_VER_MN 45 -#define UNIATA_VER_SUB_MJ 1 -#define UNIATA_VER_SUB_MN 8 -#define UNIATA_VER_DOT_COMMA 0,45,1,8 -#define UNIATA_VER_DOT_STR "0.45.1.8" +#define UNIATA_VER_SUB_MJ 2 +#define UNIATA_VER_SUB_MN 0 +#define UNIATA_VER_DOT_COMMA 0,45,2,0 +#define UNIATA_VER_DOT_STR "0.45.2.0" #define UNIATA_VER_YEAR 2014 #define UNIATA_VER_YEAR_STR "2014"