diff -ruN v45i1\chglog.txt v45i3\chglog.txt --- v45i1\chglog.txt Thu Sep 24 13:06:12 2015 +++ v45i3\chglog.txt Tue Sep 29 10:59:44 2015 @@ -953,3 +953,28 @@ o) implemented quick device absence detection for all types of VM (0x00 status) o) stop detection process in IssueIdentify if after IDENTIFY command still reports 0x00 status. + +-- +2015.09.25 - v0.45i1 + +*) added more logs to IssueIdentify +!) removed unhandled ATA_DMA attempt from Promice init code. +e) temporary (for test only) removed HDD cache/acoustic/etc tuning (ROS +BUG-8280) ++) HDD tuning checks Capability flags + +-- +2015.09.27 - v0.45i2 + +*) added more logs to IssueIdentify (Security status) +e) reverted HDD cache/acoustic/etc tuning (see 0.45i1) +e) error/retry context is preserved after bus-reset and new attempts +should be performed with lower transfer rate like after regular error +condition. This affects IDE Read/Write operations only. + +-- +2015.09.29 - v0.45i3 + +*) added more logs to IssueIdentify capabilities (IORDY, SoftReset) +e) used Linux code for Promise DMA init instead of FreeBSD +!) fixed bug with unnecessaru ExcludeFromSelect option in NT4 .INF diff -ruN v45i1\driver\bsmaster.h v45i3\driver\bsmaster.h --- v45i1\driver\bsmaster.h Wed Sep 23 19:07:18 2015 +++ v45i3\driver\bsmaster.h Tue Sep 29 11:00:02 2015 @@ -31,7 +31,7 @@ Revision History: Code was created by - Alter, Copyright (c) 2002-2014 + Alter, Copyright (c) 2002-2015 Some definitions were taken from FreeBSD 4.3-9.2 ATA driver by Søren Schmidt, Copyright (c) 1998-2014 @@ -1203,6 +1203,11 @@ struct _HW_DEVICE_EXTENSION* DeviceExtension; struct _HW_CHANNEL* chan; ULONG Lun; + + ULONGLONG errLastLba; + ULONG errBCount; + UCHAR errRetry; + UCHAR errPadding[3]; #ifdef IO_STATISTICS diff -ruN v45i1\driver\Dist\2K\uata_2k.inf v45i3\driver\Dist\2K\uata_2k.inf --- v45i1\driver\Dist\2K\uata_2k.inf Fri Sep 25 12:52:16 2015 +++ v45i3\driver\Dist\2K\uata_2k.inf Tue Sep 29 11:32:50 2015 @@ -6,7 +6,7 @@ ClassGUID={4D36E97B-E325-11CE-BFC1-08002BE10318} Class=SCSIAdapter CatalogFile=uniata.cat -DriverVer=09/25/2015,0.45.9.1 +DriverVer=09/29/2015,0.45.9.3 ; ; Source file information diff -ruN v45i1\driver\Dist\2K\uata_2kh.inf v45i3\driver\Dist\2K\uata_2kh.inf --- v45i1\driver\Dist\2K\uata_2kh.inf Fri Sep 25 12:52:16 2015 +++ v45i3\driver\Dist\2K\uata_2kh.inf Tue Sep 29 11:32:50 2015 @@ -6,7 +6,7 @@ ClassGUID={4D36E97B-E325-11CE-BFC1-08002BE10318} Class=hdc CatalogFile=uniata.cat -DriverVer=09/25/2015,0.45.9.1 +DriverVer=09/29/2015,0.45.9.3 ; ; Source file information diff -ruN v45i1\driver\Dist\2K\uniata_w2k.reg v45i3\driver\Dist\2K\uniata_w2k.reg --- v45i1\driver\Dist\2K\uniata_w2k.reg Fri Sep 25 12:52:18 2015 +++ v45i3\driver\Dist\2K\uniata_w2k.reg Tue Sep 29 11:32:50 2015 @@ -6,7 +6,7 @@ "Start"=dword:00000000 "Tag"=dword:00000019 "Type"=dword:00000001 -"DisplayName"="Universal BusMaster SATA/ATA/ATAPI Driver v0.45.9.1" +"DisplayName"="Universal BusMaster SATA/ATA/ATAPI Driver v0.45.9.3" "ImagePath"=hex(2):53,79,73,74,65,6d,33,32,5c,44,52,49,56,45,52,53,5c,75,6e,69,\ 61,74,61,2e,73,79,73,00 diff -ruN v45i1\driver\Dist\NT4\uata_nt4.inf v45i3\driver\Dist\NT4\uata_nt4.inf --- v45i1\driver\Dist\NT4\uata_nt4.inf Fri Sep 25 12:52:16 2015 +++ v45i3\driver\Dist\NT4\uata_nt4.inf Tue Sep 29 11:32:50 2015 @@ -6,7 +6,7 @@ ClassGUID={4D36E97B-E325-11CE-BFC1-08002BE10318} Class=SCSIAdapter CatalogFile=uniata.cat -DriverVer=09/25/2015,0.45.9.1 +DriverVer=09/29/2015,0.45.9.3 ; ; Source file information @@ -35,7 +35,7 @@ DefaultDestDir = 12 ; DIRID_DRIVERS [ControlFlags] -ExcludeFromSelect = * +;ExcludeFromSelect = * ; ; Driver information Binary files v45i1\driver\Dist\tools\build_inf.exe and v45i3\driver\Dist\tools\build_inf.exe differ diff -ruN v45i1\driver\Dist\tools\rebuild_inf.bat v45i3\driver\Dist\tools\rebuild_inf.bat --- v45i1\driver\Dist\tools\rebuild_inf.bat Sat Dec 29 13:50:26 2012 +++ v45i3\driver\Dist\tools\rebuild_inf.bat Tue Sep 29 11:32:30 2015 @@ -28,6 +28,7 @@ srchrep -src "uata_2k.inf" -dest "uata_nt4.inf" uata_nt4.inf > nul srchrep -src "%%CLASSNAME%%" -dest "IDE ATA/ATAPI" uata_nt4.inf > nul srchrep -src "System Bus Extender" -dest "SCSI miniport" uata_nt4.inf > nul +srchrep -src "ExcludeFromSelect" -dest ";ExcludeFromSelect" uata_nt4.inf > nul srchrep -src "%%EDITION%%" -dest " (Win 2000)" uata_2k.inf > nul copy uata_2k.inf uata_2kh.inf diff -ruN v45i1\driver\Dist\XP\uata_xp.inf v45i3\driver\Dist\XP\uata_xp.inf --- v45i1\driver\Dist\XP\uata_xp.inf Fri Sep 25 12:52:18 2015 +++ v45i3\driver\Dist\XP\uata_xp.inf Tue Sep 29 11:32:50 2015 @@ -6,7 +6,7 @@ ClassGUID={4D36E97B-E325-11CE-BFC1-08002BE10318} Class=SCSIAdapter CatalogFile=uniata.cat -DriverVer=09/25/2015,0.45.9.1 +DriverVer=09/29/2015,0.45.9.3 ; ; Source file information diff -ruN v45i1\driver\Dist\XP\uata_xph.inf v45i3\driver\Dist\XP\uata_xph.inf --- v45i1\driver\Dist\XP\uata_xph.inf Fri Sep 25 12:52:18 2015 +++ v45i3\driver\Dist\XP\uata_xph.inf Tue Sep 29 11:32:50 2015 @@ -6,7 +6,7 @@ ClassGUID={4D36E97B-E325-11CE-BFC1-08002BE10318} Class=hdc CatalogFile=uniata.cat -DriverVer=09/25/2015,0.45.9.1 +DriverVer=09/29/2015,0.45.9.3 ; ; Source file information diff -ruN v45i1\driver\id_ata.cpp v45i3\driver\id_ata.cpp --- v45i1\driver\id_ata.cpp Fri Sep 25 12:50:46 2015 +++ v45i3\driver\id_ata.cpp Mon Sep 28 17:40:40 2015 @@ -1780,13 +1780,11 @@ KdPrint2((PRINT_PREFIX "R-rate %d\n", deviceExtension->FullIdentifyData.NominalMediaRotationRate )); - KdPrint2((PRINT_PREFIX "WC %d/%d, LA %d/%d, Protected %d/%d, WB %d/%d, RB %d/%d, Q %d/%d\n", + KdPrint2((PRINT_PREFIX "WC %d/%d, LA %d/%d, WB %d/%d, RB %d/%d, Q %d/%d\n", deviceExtension->FullIdentifyData.FeaturesEnabled.WriteCache, deviceExtension->FullIdentifyData.FeaturesSupport.WriteCache, deviceExtension->FullIdentifyData.FeaturesEnabled.LookAhead, deviceExtension->FullIdentifyData.FeaturesSupport.LookAhead, - deviceExtension->FullIdentifyData.FeaturesEnabled.Protected, - deviceExtension->FullIdentifyData.FeaturesSupport.Protected, deviceExtension->FullIdentifyData.FeaturesEnabled.WriteBuffer, deviceExtension->FullIdentifyData.FeaturesSupport.WriteBuffer, deviceExtension->FullIdentifyData.FeaturesEnabled.ReadBuffer, @@ -1795,6 +1793,13 @@ deviceExtension->FullIdentifyData.FeaturesSupport.Queued )); + KdPrint2((PRINT_PREFIX "Protected %d/%d status %#x, rev %#x\n", + deviceExtension->FullIdentifyData.FeaturesEnabled.Protected, + deviceExtension->FullIdentifyData.FeaturesSupport.Protected, + deviceExtension->FullIdentifyData.SecurityStatus, + deviceExtension->FullIdentifyData.MasterPasswdRevision + )); + // Read very-old-style drive geometry KdPrint2((PRINT_PREFIX "CHS %#x:%#x:%#x\n", deviceExtension->FullIdentifyData.NumberOfCylinders, @@ -1827,6 +1832,12 @@ } // Check for LBA mode KdPrint2((PRINT_PREFIX "SupportLba flag %#x\n", deviceExtension->FullIdentifyData.SupportLba)); + KdPrint2((PRINT_PREFIX "SupportDMA flag %#x\n", deviceExtension->FullIdentifyData.SupportDma)); + KdPrint2((PRINT_PREFIX "SoftReset %#x\n", deviceExtension->FullIdentifyData.SoftReset)); + KdPrint2((PRINT_PREFIX "SupportIordy %#x, DisableIordy %#x\n", + deviceExtension->FullIdentifyData.SupportIordy, + deviceExtension->FullIdentifyData.DisableIordy + )); KdPrint2((PRINT_PREFIX "MajorRevision %#x\n", deviceExtension->FullIdentifyData.MajorRevision)); KdPrint2((PRINT_PREFIX "UserAddressableSectors %#x\n", deviceExtension->FullIdentifyData.UserAddressableSectors)); if ( deviceExtension->FullIdentifyData.SupportLba @@ -2271,17 +2282,17 @@ #ifndef UNIATA_CORE while((CurSrb = UniataGetCurRequest(chan))) { + PHW_LU_EXTENSION LunExt; PATA_REQ AtaReq = (PATA_REQ)(CurSrb->SrbExtension); + i = GET_CDEV(CurSrb); + KdPrint2((PRINT_PREFIX " Lun %x\n", i)); + LunExt = chan->lun[i]; + KdPrint2((PRINT_PREFIX "AtapiResetController: pending SRB %#x, chan %#x\n", CurSrb, chan)); if(CurSrb->Cdb[0] == SCSIOP_MECHANISM_STATUS) { - PHW_LU_EXTENSION LunExt; KdPrint2((PRINT_PREFIX " was MechStatus\n")); - i = GET_CDEV(CurSrb); - KdPrint2((PRINT_PREFIX " Lun %x\n", i)); - LunExt = chan->lun[i]; - if(!(LunExt->DeviceFlags & DFLAGS_CHANGER_INITED)) { LunExt->DeviceFlags |= DFLAGS_CHANGER_INITED; KdPrint2((PRINT_PREFIX " set DFLAGS_CHANGER_INITED\n")); @@ -2332,6 +2343,15 @@ } } + if(!ATAPI_DEVICE(chan, i) && AtaReq->bcount && AtaReq->retry < MAX_RETRIES) { + KdPrint2((PRINT_PREFIX "Save retry status %d\n", AtaReq->retry)); + LunExt->errLastLba = AtaReq->lba; + LunExt->errBCount = AtaReq->bcount; + LunExt->errRetry = AtaReq->retry+1; + } else { + LunExt->errRetry = 0; + } + // Clear request tracking fields. AtaReq->WordsLeft = 0; AtaReq->DataBuffer = NULL; @@ -3197,9 +3217,7 @@ LunExt->MaximumBlockXfer)); } - if(LunExt->IdentifyData.MajorRevision - && 0 /* DEBUG !!!! REMOVE ME */ - ) { + if(LunExt->IdentifyData.MajorRevision) { if(LunExt->opt_ReadCacheEnable) { KdPrint2((PRINT_PREFIX " Try Enable Read Cache\n")); @@ -6723,6 +6741,16 @@ AtaReq->bcount)); AtaReq->lba = lba; + if(LunExt->errRetry && + lba == LunExt->errLastLba && + AtaReq->bcount == LunExt->errBCount) { + KdPrint3((PRINT_PREFIX "IdeReadWrite: Retry after BUS_RESET %d @%#I64x (%#x)\n", + LunExt->errRetry, LunExt->errLastLba, LunExt->errBCount)); + if(AtaReq->retry < MAX_RETRIES) { + AtaReq->retry = LunExt->errRetry; + AtaReq->Flags |= REQ_FLAG_FORCE_DOWNRATE; + } + } // assume best case here // we cannot reinit Dma until previous request is completed diff -ruN v45i1\driver\id_dma.cpp v45i3\driver\id_dma.cpp --- v45i1\driver\id_dma.cpp Thu Sep 24 15:24:08 2015 +++ v45i3\driver\id_dma.cpp Mon Sep 28 17:42:04 2015 @@ -2307,11 +2307,19 @@ ULONG ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK; //ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK; - ULONG timing = 0; + ULONG port = 0x60 + (dev<<2); if(mode == ATA_PIO5) mode = ATA_PIO4; + if(mode < ATA_PIO0) + mode = ATA_PIO0; + +#if 0 +// **** FreeBSD code **** + + ULONG timing = 0; + switch(ChipType) { case PROLD: switch (mode) { @@ -2355,7 +2363,77 @@ if(!timing) { return; } - SetPciConfig4(0x60 + (dev<<2), timing); + SetPciConfig4(port, timing); + +#else +// **** Linux code **** + + UCHAR r_bp, r_cp, r_ap; + ULONG i; + + static UCHAR udma_timing[6][2] = { + { 0x60, 0x03 }, /* 33 Mhz Clock */ + { 0x40, 0x02 }, + { 0x20, 0x01 }, + { 0x40, 0x02 }, /* 66 Mhz Clock */ + { 0x20, 0x01 }, + { 0x20, 0x01 } + }; + static UCHAR mdma_timing[3][2] = { + { 0xe0, 0x0f }, + { 0x60, 0x04 }, + { 0x60, 0x03 }, + }; + static USHORT pio_timing[5] = { + 0x0913, 0x050C , 0x0308, 0x0206, 0x0104 + }; + + if(mode > ATA_UDMA5) { + return; + } + + if(mode > ATA_WDMA0) { + + GetPciConfig1(port+1, r_bp); + GetPciConfig1(port+2, r_cp); + + r_bp &= ~0xE0; + r_cp &= ~0x0F; + + if(mode >= ATA_UDMA0) { + i = mode - ATA_UDMA0; + r_bp |= udma_timing[i][0]; + r_cp |= udma_timing[i][1]; + + } else { + i = mode - ATA_WDMA0; + r_bp |= mdma_timing[i][0]; + r_cp |= mdma_timing[i][1]; + } + SetPciConfig1(port+1, r_bp); + SetPciConfig1(port+2, r_cp); + } else + if(mode <= ATA_PIO5) { + GetPciConfig1(port+0, r_ap); + GetPciConfig1(port+1, r_bp); + + i = mode - ATA_PIO0; + r_ap &= ~0x3F; /* Preserve ERRDY_EN, SYNC_IN */ + r_bp &= ~0x1F; + r_ap |= (UCHAR)(pio_timing[i] >> 8); + r_bp |= (UCHAR)(pio_timing[i] & 0xFF); + +// if (ata_pio_need_iordy(adev)) + r_ap |= 0x20; /* IORDY enable */ +// if (adev->class == ATA_DEV_ATA) +// r_ap |= 0x10; /* FIFO enable */ + + SetPciConfig1(port+0, r_ap); + SetPciConfig1(port+1, r_bp); + } + +#endif + } // end promise_timing() diff -ruN v45i1\driver\uniata_ver.h v45i3\driver\uniata_ver.h --- v45i1\driver\uniata_ver.h Fri Sep 25 12:52:08 2015 +++ v45i3\driver\uniata_ver.h Tue Sep 29 11:32:44 2015 @@ -1,10 +1,10 @@ -#define UNIATA_VER_STR "45i1" -#define UNIATA_VER_DOT 0.45.9.1 +#define UNIATA_VER_STR "45i3" +#define UNIATA_VER_DOT 0.45.9.3 #define UNIATA_VER_MJ 0 #define UNIATA_VER_MN 45 #define UNIATA_VER_SUB_MJ 9 -#define UNIATA_VER_SUB_MN 1 -#define UNIATA_VER_DOT_COMMA 0,45,9,1 -#define UNIATA_VER_DOT_STR "0.45.9.1" +#define UNIATA_VER_SUB_MN 3 +#define UNIATA_VER_DOT_COMMA 0,45,9,3 +#define UNIATA_VER_DOT_STR "0.45.9.3" #define UNIATA_VER_YEAR 2015 #define UNIATA_VER_YEAR_STR "2015"