Author: akhaldi Date: Wed Aug 8 01:17:53 2012 New Revision: 57053
URL: http://svn.reactos.org/svn/reactos?rev=57053&view=rev Log: [UNIATA] * Sync with v0.42i2.
Modified: trunk/reactos/drivers/storage/ide/uniata/bsmaster.h trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp trunk/reactos/drivers/storage/ide/uniata/inc/misc.h trunk/reactos/drivers/storage/ide/uniata/uniata_ver.h
Modified: trunk/reactos/drivers/storage/ide/uniata/bsmaster.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/... ============================================================================== --- trunk/reactos/drivers/storage/ide/uniata/bsmaster.h [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/ide/uniata/bsmaster.h [iso-8859-1] Wed Aug 8 01:17:53 2012 @@ -192,6 +192,7 @@ #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
Modified: trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/... ============================================================================== --- trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp [iso-8859-1] Wed Aug 8 01:17:53 2012 @@ -508,10 +508,11 @@ ULONG i; UCHAR Status;
+ GetStatus(chan, Status); for (i=0; i<g_opt_WaitBusyCount; i++) { - GetStatus(chan, Status); if (Status & IDE_STATUS_BUSY) { AtapiStallExecution(g_opt_WaitBusyDelay); + GetStatus(chan, Status); continue; } else { break; @@ -2069,7 +2070,7 @@ KdPrint2((PRINT_PREFIX "AtapiResetController: Reset channel %d\n", j)); chan = &(deviceExtension->chan[j]); MaxLuns = chan->NumberLuns; - KdPrint2((PRINT_PREFIX " CompleteType %#x, Luns %d, chan %#x\n", CompleteType, MaxLuns, chan)); + KdPrint2((PRINT_PREFIX " CompleteType %#x, Luns %d, chan %#x, sptr %#x\n", CompleteType, MaxLuns, chan, &chan)); //MaxLuns = (chan->ChannelCtrlFlags & CTRFLAGS_NO_SLAVE) ? 1 : 2; if(CompleteType != RESET_COMPLETE_NONE) { #ifndef UNIATA_CORE @@ -2077,11 +2078,12 @@
PATA_REQ AtaReq = (PATA_REQ)(CurSrb->SrbExtension);
- KdPrint2((PRINT_PREFIX "AtapiResetController: pending SRB %#x\n", CurSrb)); + KdPrint2((PRINT_PREFIX "AtapiResetController: pending SRB %#x, chan %#x\n", CurSrb, chan)); // Check and see if we are processing an internal srb if (AtaReq->OriginalSrb) { KdPrint2((PRINT_PREFIX " restore original SRB %#x\n", AtaReq->OriginalSrb)); AtaReq->Srb = AtaReq->OriginalSrb; + CurSrb->SrbExtension = NULL; AtaReq->OriginalSrb = NULL; // NOTE: internal SRB doesn't get to SRB queue !!! CurSrb = AtaReq->Srb; @@ -2104,6 +2106,7 @@ if (CurSrb->SenseInfoBuffer) {
PSENSE_DATA senseBuffer = (PSENSE_DATA)CurSrb->SenseInfoBuffer; + KdPrint2((PRINT_PREFIX " senseBuffer %#x, chan %#x\n", senseBuffer, chan));
senseBuffer->ErrorCode = 0x70; senseBuffer->Valid = 1; @@ -2125,6 +2128,7 @@ AtaReq->WordsLeft = 0; AtaReq->DataBuffer = NULL; AtaReq->TransferLength = 0; + KdPrint2((PRINT_PREFIX "chan %#x\n", chan));
ScsiPortNotification(RequestComplete, deviceExtension, @@ -2161,7 +2165,7 @@ AtapiDisableInterrupts(deviceExtension, j); UniataAhciReset(HwDeviceExtension, j); } else { - KdPrint2((PRINT_PREFIX " ATA path\n")); + KdPrint2((PRINT_PREFIX " ATA path, chan %#x\n", chan)); KdPrint2((PRINT_PREFIX " disable intr (0)\n")); AtapiDisableInterrupts(deviceExtension, j); KdPrint2((PRINT_PREFIX " done\n")); @@ -2170,8 +2174,9 @@ ULONG mask; ULONG pshift; ULONG timeout; - if(!(ChipFlags & UNIATA_SATA)) + if(!(ChipFlags & UNIATA_SATA)) { goto default_reset; + } if(!UniataIsSATARangeAvailable(deviceExtension, j)) { goto default_reset; } @@ -3917,7 +3922,7 @@ UCHAR dma_status = 0; UCHAR reg8 = 0; ULONG reg32 = 0; - UCHAR statusByte; + UCHAR statusByte = 0; ULONG slotNumber = deviceExtension->slotNumber; ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber; ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK; @@ -5017,16 +5022,21 @@ KdPrint2((PRINT_PREFIX "AtapiInterrupt: i-reason=%d, status=%#x\n", interruptReason, statusByte)); if(deviceExtension->HwFlags & UNIATA_AHCI) { KdPrint2((PRINT_PREFIX " AHCI path, WordsTransfered %x, WordsLeft %x\n", AtaReq->WordsTransfered, AtaReq->WordsLeft)); - if(chan->AhciLastIS & ATA_AHCI_P_IX_OF) { - status = SRB_STATUS_DATA_OVERRUN; +/* if(chan->AhciLastIS & ATA_AHCI_P_IX_OF) { + //status = SRB_STATUS_DATA_OVERRUN; DataOverrun = TRUE; } else { status = SRB_STATUS_SUCCESS; - } + }*/ if(AtaReq->WordsTransfered >= AtaReq->WordsLeft) { AtaReq->WordsLeft = 0; } else { AtaReq->WordsLeft -= AtaReq->WordsTransfered; + } + if(AtaReq->WordsLeft) { + status = SRB_STATUS_DATA_OVERRUN; + } else { + status = SRB_STATUS_SUCCESS; } chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_OPERATION; goto CompleteRequest; @@ -6781,6 +6791,7 @@ // DEBUG !!!! for TEST ONLY KdPrint2((PRINT_PREFIX "AtapiSendCommand: force use dma (ahci)\n")); use_dma = TRUE; + goto setup_dma; } else if(Srb->Cdb[0] == SCSIOP_REQUEST_SENSE) { KdPrint2((PRINT_PREFIX "AtapiSendCommand: SCSIOP_REQUEST_SENSE, no DMA setup\n")); @@ -6839,6 +6850,7 @@ break; } // try setup DMA +setup_dma: if(use_dma) { if(deviceExtension->HwFlags & UNIATA_AHCI) { KdPrint2((PRINT_PREFIX "AtapiSendCommand: use dma (ahci)\n")); @@ -7625,11 +7637,6 @@ LunExt->IdentifyData.NumberOfCylinders; } lba--; - - //((PREAD_CAPACITY_DATA)Srb->DataBuffer)->LogicalBlockAddress = - // (((PUCHAR)&i)[0] << 24) | (((PUCHAR)&i)[1] << 16) | - // (((PUCHAR)&i)[2] << 8) | ((PUCHAR)&i)[3]; - MOV_QD_SWP( ((PREAD_CAPACITY16_DATA)Srb->DataBuffer)->LogicalBlockAddress, lba );
KdPrint2((PRINT_PREFIX @@ -9815,6 +9822,8 @@ cdb->MECH_STATUS.OperationCode = SCSIOP_MECHANISM_STATUS; cdb->MECH_STATUS.AllocationLength[1] = sizeof(MECHANICAL_STATUS_INFORMATION_HEADER);
+ KdPrint2((PRINT_PREFIX " MechanismStatusSrb %#x\n", srb)); + return srb; } // end BuildMechanismStatusSrb()
@@ -9856,6 +9865,8 @@ cdb = (PCDB)srb->Cdb; cdb->CDB6INQUIRY.OperationCode = SCSIOP_REQUEST_SENSE; cdb->CDB6INQUIRY.AllocationLength = sizeof(SENSE_DATA); + + KdPrint2((PRINT_PREFIX " RequestSenseSrb %#x\n", srb));
return srb; } // end BuildRequestSenseSrb()
Modified: trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/... ============================================================================== --- trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp [iso-8859-1] Wed Aug 8 01:17:53 2012 @@ -996,7 +996,9 @@ /****************/
KdPrint2((PRINT_PREFIX "SATA Generic\n")); - if(udmamode > 5) { + if((udmamode >= 5) || (ChipFlags & UNIATA_AHCI) || chan->MaxTransferMode >= ATA_SA150) { + /* some drives report UDMA6, some UDMA5 */ + /* ATAPI may not have SataCapabilities set in IDENTIFY DATA */ if(LunExt->IdentifyData.SataCapabilities != 0x0000 && LunExt->IdentifyData.SataCapabilities != 0xffff) { //udmamode = min(udmamode, 6);
Modified: trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/... ============================================================================== --- trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/ide/uniata/id_probe.cpp [iso-8859-1] Wed Aug 8 01:17:53 2012 @@ -2162,10 +2162,10 @@ KdPrint2((PRINT_PREFIX "Multichannel native mode, go...\n")); #ifndef UNIATA_USE_XXableInterrupts // If we raise IRQL to TIMER value, other interrupt cannot occure on the same CPU - if(KeNumberProcessors < 2) { +/* if(KeNumberProcessors < 2) { KdPrint2((PRINT_PREFIX "Unnecessary (?), UP machine\n")); //return STATUS_SUCCESS; - } + }*/ #endif //UNIATA_USE_XXableInterrupts } else { KdPrint2((PRINT_PREFIX "Unnecessary\n"));
Modified: trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/... ============================================================================== --- trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp [iso-8859-1] Wed Aug 8 01:17:53 2012 @@ -70,6 +70,15 @@ SStatus.SPD == SStatus_SPD_Gen3) { chan->lun[0]->TransferMode = ATA_SA150 + (UCHAR)(SStatus.SPD - 1); KdPrint2((PRINT_PREFIX "SATA TransferMode %#x\n", chan->lun[0]->TransferMode)); + if(chan->MaxTransferMode < chan->lun[0]->TransferMode) { + KdPrint2((PRINT_PREFIX "SATA upd chan TransferMode\n")); + chan->MaxTransferMode = chan->lun[0]->TransferMode; + } + if(deviceExtension->MaxTransferMode < chan->lun[0]->TransferMode) { + KdPrint2((PRINT_PREFIX "SATA upd controller TransferMode\n")); + deviceExtension->MaxTransferMode = chan->lun[0]->TransferMode; + } + break; } AtapiStallExecution(10000); @@ -664,6 +673,9 @@ BaseMemAddress = deviceExtension->BaseIoAHCI_0.Addr; MemIo = deviceExtension->BaseIoAHCI_0.MemIo;
+ deviceExtension->MaxTransferMode = ATA_SA150+(((CAP & AHCI_CAP_ISS_MASK) >> 20)-1); + KdPrint2((PRINT_PREFIX " SATA Gen %d\n", ((CAP & AHCI_CAP_ISS_MASK) >> 20) )); + for(c=0; c<deviceExtension->NumberChannels; c++) { chan = &deviceExtension->chan[c]; offs = sizeof(IDE_AHCI_REGISTERS) + c*sizeof(IDE_AHCI_PORT_REGISTERS); @@ -825,6 +837,7 @@ KdPrint2((PRINT_PREFIX " AHCI version %#x.%02x controller with %d ports (mask %#x) detected\n", v_Mj, v_Mn, NumberChannels, PI)); + KdPrint((" AHCI SATA Gen %d\n", (((CAP & AHCI_CAP_ISS_MASK) >> 20)) ));
if(CAP & AHCI_CAP_SPM) { KdPrint2((PRINT_PREFIX " PM supported\n")); @@ -865,7 +878,7 @@ deviceExtension->DmaSegmentAlignmentMask = -1; // no restrictions
deviceExtension->BusMaster = DMA_MODE_AHCI; - deviceExtension->MaxTransferMode = max(deviceExtension->MaxTransferMode, ATA_SA150); + deviceExtension->MaxTransferMode = max(deviceExtension->MaxTransferMode, ATA_SA150+(((CAP & AHCI_CAP_ISS_MASK) >> 20)-1) );
return TRUE; } // end UniataAhciDetect() @@ -1190,11 +1203,11 @@ UCHAR statusByte; PATA_REQ AtaReq; ULONG fis_size; - ULONG tag=0; + //ULONG tag=0; //PIDE_AHCI_CMD AHCI_CMD = &(chan->AhciCtlBlock->cmd); PIDE_AHCI_CMD AHCI_CMD = NULL;
- PIDE_AHCI_CMD_LIST AHCI_CL = &(chan->AhciCtlBlock->cmd_list[tag]); + //PIDE_AHCI_CMD_LIST AHCI_CL = &(chan->AhciCtlBlock->cmd_list[tag]);
KdPrint2((PRINT_PREFIX "UniataAhciSendPIOCommand: cntrlr %#x:%#x dev %#x, cmd %#x, lba %#I64x bcount %#x feature %#x, buff %#x, len %#x, WF %#x \n", deviceExtension->DevIndex, lChannel, DeviceNumber, command, lba, bcount, feature, data, length, wait_flags ));
Modified: trunk/reactos/drivers/storage/ide/uniata/inc/misc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/... ============================================================================== --- trunk/reactos/drivers/storage/ide/uniata/inc/misc.h [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/ide/uniata/inc/misc.h [iso-8859-1] Wed Aug 8 01:17:53 2012 @@ -6,7 +6,7 @@ /* The definitions look so crappy, because the code doesn't care whether the source is an array or an integer */ #define MOV_DD_SWP(a,b) ((a) = RtlUlongByteSwap(*(PULONG)&(b))) -#define MOV_DW_SWP(a,b) ((a) = RtlUshortByteSwap(*(PUSHORT)&(b))) +#define MOV_DW_SWP(a,b) ( ((PUSHORT)&(a))[0] = RtlUshortByteSwap(*(PUSHORT)&(b))) #define MOV_SWP_DW2DD(a,b) ((a) = RtlUshortByteSwap(*(PUSHORT)&(b))) #define MOV_QD_SWP(a,b) { ((PULONG)&(a))[0] = RtlUlongByteSwap( ((PULONG)&(b))[1]); ((PULONG)&(a))[1] = RtlUlongByteSwap( ((PULONG)&(b))[0]); }
Modified: trunk/reactos/drivers/storage/ide/uniata/uniata_ver.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata/... ============================================================================== --- trunk/reactos/drivers/storage/ide/uniata/uniata_ver.h [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/ide/uniata/uniata_ver.h [iso-8859-1] Wed Aug 8 01:17:53 2012 @@ -1,10 +1,10 @@ -#define UNIATA_VER_STR "42h" -#define UNIATA_VER_DOT 0.42.8.0 +#define UNIATA_VER_STR "42i2" +#define UNIATA_VER_DOT 0.42.9.2 #define UNIATA_VER_MJ 0 #define UNIATA_VER_MN 42 -#define UNIATA_VER_SUB_MJ 8 -#define UNIATA_VER_SUB_MN 0 -#define UNIATA_VER_DOT_COMMA 0,42,8,0 -#define UNIATA_VER_DOT_STR "0.42.8.0" +#define UNIATA_VER_SUB_MJ 9 +#define UNIATA_VER_SUB_MN 2 +#define UNIATA_VER_DOT_COMMA 0,42,9,2 +#define UNIATA_VER_DOT_STR "0.42.9.2" #define UNIATA_VER_YEAR 2012 #define UNIATA_VER_YEAR_STR "2012"