Universal ATA driver for Windows NT4/2000/XP
Keywords: Universal ATA driver, Universal IDE driver, Universal UDMA driver, Universal DMA driver, Windows, universal, ata, driver, dma, BusMaster, NT4, 2000, w2k, XP

Alter.Org.UA
<< Back |  | Home |  | RU |  |  | www/www1/www2
- | ### Universal ATA driver for Windows NT4/2000/XP #### Updated 2005.03.24 Download Features Compatibility Install Guide TroubleShooter/FAQ Registry settings Management utility Plans History Versions #### Download To get latest stable version (v 0.31a) click here The latest beta version - v 0.31b #### Features Support of numerous IDE controllers and generic ATA/ATAPI DMA/UDMA support (up to ATA-133) on known and generic DMA on unknown controllers support of contiguous set of modes UDMA0-UDMA6 (ATA-16/25/33/44/66/100/133) Serial ATA support LBA48 (large drives greater than 128Gb) support no reinstall required when migrating to different IDE controller or motherboard. internal command queueing and optimized execution order user-mode device management utility. You can change data transfer mode (PIO/DMA/UDMA) on the fly. NT4, 2000, XP support (may be 2003/2005 - not tested) tuning Read/Write cache, transfer modes and many other things via Registry settings #### Plans RAID support (mirror, stripping, mirror+stripping) NT3.51 support Hot swap for IDE devices under OSes prior w2k Win 9x/ME support correct PNP (WDM) implementation for w2k and higher #### History The idea of writing own universal ATA driver had appeared due to the following reasons : compatibility of DMA/UDMA mode (really, the driver supporting these modes) and varoius CD-R/RW recording software (see CD-R/RW & DMA drivers) absence of user-level IDE management tools: transfer mode management/monitoring (PIO, (U)DMA), getting detailed device information absence of simultaneous usage of devices operating in different transfer modes (PIO vs (U)DMA) with single IDE cable. a wish to implement command reordering to improve performance (I hope everybody knows why SCSI shows better results than IDE in multiprocess environment. an idea of organizing LBA-based sector cache, (of course, cache block would be at least 64k) neverending problems with decision what is better: to be able to boot OS on any motherboard or to use UDMA. Such questions come when we have to support many computers with different hardware, but identical set of software (NortonGhost's users know). Especially topical for w2k, where changing of IDE controller makes system unbootable. By the way, to solve this problem one significant improvment is planned. Read about it here. There are some wishes from downloaders (not implemented yet): RAID support (mirror, stripping, mirror+stripping) NT3.51 support Hot swap for IDE devices under OSes prior w2k After reading some specifications (for HDDs, ATAPI and ATA/IDE controllers) and looking through sources (from NT4 DDK and FreeBSD 4.3 - 4.5) the first working version - BusMaster_v8a_ok.rar/tgz (52.1 Kb/60.5 Kb) (v 0.8a). Note, that the last one is BusMaster_v31a.rar/tgz (80 Kb/96 Kb) :) That version (v 0.8a) successfully detected all available controllers under NT4. The first controller list was: VIA 82C586 (ETEQ) on SOYO-5EHM VIA 8233 on Soltek-DRV4 CMD 649 (an additional PCI controller) And a little later: Intel ICH on ~10 different machines Intel ICH2 on Dual-Processor machine ServerWorks CSB5 on Dual-Processor machine AcerLabs Aladdin V (Rev 0xC4) on Notebook Intel PIIX3 VIA 82C686 By design the driver initializes any PCI device that reports itself as an IDE Controller and also the following well-known Mass-storage Controllers: good BusMasters: Intel PIIX / PIIX3 / PIIX4 Intel ICH / ICH0 / ICH2 AcerLabs Aladdin ATA / ATA33 VIA ATAxxx SiS 5591 ATA33 CMD 649 ATA100 checked CMD 648 / 646 Cyrix 5530 ATA33 AMD 756 ATA66 ServerWorks ROSB4 ATA33 Promise TX2 ATA33 / ATA66 / ATA100 HighPoint ATAxxx Intel ICH3, PIIX4e nVIDIA nForce/nForce2 AMD 768, 766, 756 ServerWorks CSB5 ATA66/100 Promise TX2 ATA133 Promise Ultra/FastTrak 33/66/100 Promise OEM ATA100 Acard ATPxxxx 33/66/100 Cenatek Rocket Drive Intel ICH4 /ICH5, PIIX4e SiS Family Intel ICH6 National Geode SC1100 IT8xxx buggy controllers: PC Technology RZ 1000 PC Technology 37C922 CMD 640 SiS83C601 Check if the driver really supports all mentioned devices is rather difficult. But some compatibility matrices for some versions you can find here Debug Version 0.31b (rar/tgz) - 111.8 Kb/131.6 Kb. Version 0.31b (rar/tgz) - 80.1 Kb/96.1 Kb. and sources 0.31b (rar/tgz) - 166.1 Kb/206.5 Kb. Extension in Registry settings related to supported device classes. Now it is possible to enable/disable support of PCI, ISA, ISA/PCI Compat and MCA. Also for Debug purposes added option for dumping Debug messages to blue screen. HiNT VXPro II is added to the list of known devices. However, it doesn work yet :) Note: do not install Debug build under Win 2000 and higher until DbgPrint Dump is installed with
      DbgPrintLog.exe -full -T DTN -wd X:\dir_for_logs -drv 1 -svc A -drvopt DoNotPassMessagesDown 1
          -drvopt StopOnBufferOverflow 1 -drvopt BufferSize 16384 DbgDump.log
- 2005.03.04 Version 0.31a (rar/tgz) - 80 Kb/96 Kb. and sources 0.31a (rar/tgz) - 165.9 Kb/206.3 Kb. Thanks to Axxie for discovering bug with uninitialized DEVICE_EXTENSION. This structure includes state variables of channels, connected devices and interrupt service routines. On most machines this memory block was allocated zero-filled. But on some ones it contained garbage. I've also received interesting news from Mike. He have successfully run NT4+sp6a with UniATA installed on ICH4. 2005.03.04 Version 0.31 (rar/tgz) - 79.6 Kb/95.6 Kb. and sources 0.31 (rar/tgz) - 165.1 Kb/205.4 Kb. Completely rewritten workaround for ATAPI devices those generate INTR without clearing BSY. Treate thanks to Root for testing. Fixed bug in operation sequence for sending ATAPI command. At one place interrupt status was not cleared, and at another interrupts were enabled too early. Added interrupt status clear code after controller reset. Still some extensions in Registry settings. 2005.02.20 Debug Version 0.30i (rar/tgz) - 101.6 Kb/119.8 Kb. Version 0.30i (rar/tgz) - 79.2 Kb/95.2 Kb. and sources 0.30i (rar/tgz) - 164.2 Kb/204.5 Kb. Fixed bug (too long delay) in HDD cache flushing code. .INF is updated with till one patch by Root Added experimantal workaround (from FreeBSD) for ATAPI devices those generate INTR without clearing BSY. Added workaround for the following bug in SCSIPORT.SYS from NT4: If we attempt to initialize Compatible Mode IDE controller and SCSIPORT.SYS fails resource list check, it keeps AtDiskPrimaryAddressClaimed and/or AtDiskPrimaryAddressClaimed flag(s) set to TRUE. As result the second initialization attempt fails because UniATA driver decides that this controller is already clamed by some other driver. Thanks to Vitaliy Vorobyov aka deathsoftX@yandex.ru (remove X) for bug report and fix. I've extended and documented Registry settings. Also published special debug build with logs enabled. 2005.02.08 Debug Version 0.30h (rar/tgz) - 99.9 Kb/118.2 Kb. Version 0.30h (rar/tgz) - 78.3 Kb/94.3 Kb. and sources 0.30h (rar/tgz) - 162.6 Kb/202.7 Kb. Removed too long waiting for device readiness in error handler. Implemented HDD cache flushing in response to system shutdown request. .INF is updated with patch by Root. May be this will help .INFs working properly :) Added device reset option -r to atactl.exe. It is useful when ATAPI device hangs. Published special debug build with logs enabled. Note: do not install this build until DbgPrint Dump is installed with
      DbgPrintLog.exe -full -T DTN -wd X:\dir_for_logs -drv 1 -svc A -drvopt DoNotPassMessagesDown 1
          -drvopt StopOnBufferOverflow 1 DbgDump.log
- 2005.01.30 Version 0.30g (rar/tgz) - 78.2 Kb/93.8 Kb. and sources 0.30g (rar/tgz) - 161.5 Kb/201 Kb. I've found and fixed rather specific bug: in some cases driver attempted to change transfer mode for some device on IDE bus while another device executed the command. In other cases similar situation appeared when new command came to the queue. The bug could be observed as complete system hang. On my configuration this situation could be reproduced in rather specific conditions. However, I have only 1 device on each IDE bus. My be such hang can happen on machines with 2 devices on single IDE bus much often, even during OS boot. Seems, LBA48 already works fine now. And Intel ICH4 doesn't yet :( 2005.01.16 Version 0.30e (rar/tgz) - 78.1 Kb/93.8 Kb. and sources 0.30e (rar/tgz) - 160.9 Kb/200.4 Kb. Still some fixes with LBA48 support I have forgotten to set IDE_USE_LBA flag when using LBA48 addressing there were no support for LBA48 version of IDE_VERIFY command. This command is used for surface check. in some cases READ_NATIVE_LAST_LBA/SET_MAX_LBA were not handled properly and one useful addon: implemented atactl.exe command line utility, which can enumerate IDE, SCSI and RAID controllers and display information about connected to them devices. If UniATA driver is installed, you can change data transfer mode (PIO/DMA/UDMA) for individual IDE/ATAPI devices with atactl.exe. optimized controller-specific DMA tuning code. When removing code duplicates (see usage of AtaSetTransferMode()) I have found some misscorrespondance between ATA/ATAPI device transfer mode and controller transfer mode. 2005.01.02 Version 0.30c (rar/tgz) - 69.8 Kb/75.1 Kb. and sources 0.30c (rar/tgz) - 148.6 Kb/176.8 Kb. Fixed LBA48 support bug. LBA48 is addressing mode used for large capacity drives - more than 128Gb. The problem was caused by code of determining real drive capacity. Some drives report their size as 32Gb (e.g. my Seagate Barracuda IV 40) or as 128Gb (I don't know real examples) for compatibility issues. There are special commands for retrieving real capacity and size limit removal. They are READ_NATIVE_LAST_LBA and SET_MAX_LBA. But I didn't know, about their 48-bit clones intended for drives larger than 128Gb. So, I programmed drives to limit their capacity to 128Gb wit hold commands :( Greate thanks to Alexander Spelicyn aka spelX@mail.ru (remove X) for testing with 160Gb HDD on the old good i440BX (this controlled doesn't support LBA48). Fixed bug with handling UNIATA_NO_DPC_ATAPI flag. This flag enables workaround for hangs with some new CD/DVD drives on CMD-649. 2004.12.27 Version 0.30a (rar/tgz) - 67.9 Kb/72.5 Kb. and sources 0.30a (rar/tgz) - 146.4 Kb/173.7 Kb. Once again I have rewritten Intel ICH4 support code. Saying truth, I reverted it to very old state, when it seemed working. Let's wait for testing result. Until we have no absolutely correct and 100%-reliable interaction with ScsiPort driver, I have introduced workaround. The main idea - I try to init main Onboar IDE controller using various tricks (I wrote about these tricks before). Experiments show that this workaround helps in many cases. Also, let's wait for results. 2004.12.05 Version 0.29j (rar/tgz) - 67.6 Kb/72 Kb. and sources 0.29j (rar/tgz) - 145.5 Kb/172.6 Kb. Bug-fix in SiS controller detection code. It has very interesting algorithm. There is 1 PCI IDE Controller with instant DeviceId/VendorID. There are one or two specific Bridge Device(s). Their DeviceId/VendorId determine actual type of the IDE Controller. This behavior is similar to VIA. But some models need very specific check. We change 1 byte in PCI Config Space ot the IDE Controller and check if its DeviceId have changed (!). (Seems to me, this is not too good idea). The problem was because I have lost the line which reverts controller to initial state. Greate thanks to Mike for testing my buggy versions and supplying me with pretty bug-reports (181 Kb). So, lets try new version... 2004.09.21 Still some fixes in Intel, Acer and some other controller support code. Silly bug. I put break in switch/case instead of return. As result after successfull UDMA initialization the default code was called and the device (not controller!) switched back to PIO-0. Improved SiS controlelr support. Thanks to Ivano Guerra. Of course, this is beta-version and must be tested. Try Version 0.29i3 (rar/tgz) - 67.6 Kb/72 Kb. and sources 0.29i3 (rar/tgz) - 144.9 Kb/171.9 Kb. 2004.09.08 In same code for Intel ICHxxx IDE support found still one bug. Looks like that it is mine. The bug leads to data corruption. So, v29i is removed from the site. 2004.08.26 Version 0.29i (rar/tgz) - 144.4 Kb/171.2 Kb. Found and fixed bug in Intel IDE support code. It was copied from FBSD 5.2.1 (and it is still there). Have compared the latest and some old versions and found, than 32-bit value (0x10000 << devno) is written to 16-bit register (PCI Config Space 0x54). Higher bits are truncated and lower bits are all 0. This turns the controller out from UDMA mode. But connected devices are already programmed to use UDMA. Thus we have transfer mode missmatch, and as result - hangs and crashes. I hope this fix will help. 2004.08.25 Version 0.29h (rar/tgz) - 66.9 Kb/71.4 Kb. and sources 0.29h (rar/tgz) - 143.6 Kb/170.3 Kb. Rewritten Intel IDE controller support code. I hope this will only improve compatibility. Especially for ICH4, which didn't work with previous version. Ported some new code from FBSD 5.2.1. Fixed bug with include/exclude device list in Registry. Implemented simplex-mode support. In this mode IDE channels do not operate simultaneously. For some controllers this mode is inevitable. Along with autodetect, you can turn the controller into simplex-mode using DWORD:ForceSimplex Registry value under HKLM\System\CurrentControlSet\Services\UniATA\Parameters Registry key or under its device-specific subkey. Added support for IDE devices those report 0x40 (IDE_STATUS_DRDY) status in inactive state instead of usual 0x50 (IDE_STATUS_IDLE). Such behavior was oberved under latest VMWare release (4.5.1 build-7568). Thanks to Vitaliy for information and testing. Rewritten load balancing code for separate IDE channels and devices connected to single channel. 2004.08.01 Version 0.29d (rar/tgz) - 62.4 Kb/66 Kb. and sources 0.29d (rar/tgz) - 135.9 Kb/160.1 Kb. Fixed VIA 8235 and VIA 8233A init code. That was done because I have installed UniATA on one computer with VIA 8235. After that I observed a lot pretty bugs. System worked slowly and randomly crashes. It seemed like sometimes data is not correctly read from HDD. I looked into latest FBSD ata drivers and saw no changes for this controller. At the same time there are bug-reports in formus. I looked into Linux kernel and found that for VIA 8235 and VIA 8233A PCI register 0x4c is not programmed. I did the same. Unfortunately, I cannot check if it works on that machine. During code review I found that I made a mistake when porting SiS support code from FBSD. The bug affected on secondary channel's UDMA mode register. Also fixed. 2004.06.05 Version 0.29c (rar/tgz) - 61.6 Kb/65.2 Kb. and sources 0.29c (rar/tgz) - 133.9 Kb/157.9 Kb. Fixed VIA 8235 and VIA 8233A init code. That was done because I have installed UniATA on one computer with VIA 8235. After that I observed a lot pretty bugs. System worked slowly and randomly crashes. It seemed like sometimes data is not correctly read from HDD. I looked into latest FBSD ata drivers and saw no changes for this controller. At the same time there are bug-reports in formus. I looked into Linux kernel and found that for VIA 8235 and VIA 8233A PCI register 0x4c is not programmed. I did the same. Unfortunately, I cannot check if it works on that machine. During code review I found that I made a mistake when porting SiS support code from FBSD. The bug affected on secondary channel's UDMA mode register. Also fixed. 2004.06.02 Version 0.29a (rar/tgz) - 61.1 Kb/64.7 Kb. and sources 0.29a (rar/tgz) - 133.5 Kb/157.5 Kb. Added code for a lot of new controllers. Mostly for SiS and Promese. Implemented device/vendor-specific Registry settings. You can create the following sub-keys with parameters under HKLM\System\CurrentControlSet\Services\UniATA. Paramaters - The most global settings. Paramaters\Ven_VVVV - where VVVV is Vendor ID (see. PCI Dump) Paramaters\Ven_VVVV\Dev_DDDD, where DDDD is Device Id. See the same place. Paramaters\Ven_VVVV\Dev_DDDD\Slot_XXXXXXXX, where XXXXXXXX is PCI address in 32-bit form (HEX). In general it would be pretty to create configuration utility... Implemented Include/Exclude options. Now you can create Inlude or Exclude DWORD value under Registry key, described above to Enable/Disable UniATA support for specified controller. 2004.04.08 Version 0.29b (rar/tgz) - 61.5 Kb/65.1 Kb. and sources 0.29b (rar/tgz) - 133.8 Kb/157.8 Kb. Fixed some issues in OEMSETUP.INF and TXTSETUP.OEM. After that UniATA was successfully added during text-mode w2k setup phase. Then w2k was installed on HDD connected to CMD649 IDE controlled. Note, w2k doesn't support it itself. So, I decided that these setup files are correct now. Enjoy. 2004.05.19 Version 0.28 (rar/tgz) - 58.3 Kb/61.8 Kb. and sources 0.28 (rar/tgz) - 127.2 Kb/149.1 Kb. Fixed bug with interrupt enable/disable routines. They worked with Primary channel only. At least we removed dependence on ScsiPort DMA support API. Now UniATA translates virtual addresses to physical itself. This give 2 advantages: 1) No hackar's init methods needed (ISA bridged controllers was initialized as PCI and this method worked not on all machines). 2) No more copying data between DMA buffer and user buffer. 2004.02.24 Version 0.27a (rar/tgz) - 58.2 Kb/61.9 Kb. and sources 0.27a (rar/tgz) - 124.7 Kb/147.6 Kb. Fixed error handling code for ATAPI devices (CD-ROM/RW, etc.). On some devices we must wait for DRQ bit assertion if an error occured. 2004.01.20 Version 0.27 (rar/tgz) - 58.3 Kb/61.8 Kb. and sources 0.27 (rar/tgz) - 125.5 Kb/147.1 Kb. Thanks to Vitaliy Vorobyov aka deathsoftX@yandex.ru (remove X). Fixed initialization code for NT4+SP6a Thanks to Vitaliy Vorobyov again, for rewriting installation INT. file for NT4 Interrupt service (ISR) code, that uses delays is moved to deparate thread (DPC). 2004.01.16 Version 0.26c (rar/tgz) - 55.8 Kb/59 Kb. and sources 0.26c (rar/tgz) - 120.7 Kb/141.4 Kb. Fixed bug with DMA error handling. Previous versions deadly hanged the system if such error occured. The experiment shown, that after DMA CRC error we should wait for drive readiness before retry. Special thanks to Alex Y. Matiash for bug-report Fixed interrupt handler for CMD 649 and CMD 648 controllers 2003.12.26 Version 0.26 (rar/tgz) - 55.7 Kb/59 Kb. and sources 0.26 (rar/tgz) - 119.3 Kb/140 Kb. Promise and HighPoint RAID support is now disabled by default, because we don't support RAID-arrays yet. It is possible to enable support for these controllers in standard (non-RAID) dual-channel mode:
      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UniATA\Parameters]
      "SkipRaids"=dword:00000000
New utility for w2k .INF-file reconstruction is added to distribution. It scans PCI bus for compatible, but not listed IDE controllers. If such controllers are added, they are inserted into .INF-file. 2003.09.23 Version 0.26b (rar/tgz) - 55.8 Kb/59 Kb. and sources 0.26b (rar/tgz) - 120.6 Kb/141.2 Kb. Fixed bug with DMA mode on some types of CD-ROMs 2003.11.08 Version 0.25f (rar/tgz) - 36.9 Kb/38.6 Kb. and sources 0.25f (rar/tgz) - 100.6 Kb/119.1 Kb. I've found, that even rahter old versions work under w2k. But with some restrictions: OS doesn't allow us to handle onboard (Native Mode) IDE, because in w2k IDE has its own miniport driver that differs from SCSI miniport. Now I'm thinking about the way of cheating the system to allow my driver representing Native Mode IDE controllers as SCSI devices. 2003.09.12 Version 0.25e (rar/tgz) - 164.3 Kb/200.1 Kb. Fixed bug with invisibility of the 2nd IDE channel on onboard controller. The trouble was because NT4 allows initialization of 2 PCI devices with the same address on PCI bus, but with different system resource usage (I/O ranges and IRQ). W2k doesn't permit such tricks. Thus I use single device thet handles 2 IRQs under this OS. AdapterControl fuctionality is added. It is used by OS to enable/disable controller interrupts under w2k and higher. Tests show, that PnP functionality doesn't work yet under w2k. The main difficulty lays in the following: for PnP support we must create a list of all supported devices in Registry and installation .INF file. It is not compatible with the idea of universal driver. Probably the utilities for dynamic Registry and/or .INF file update will be created. Also probably 2 services using the same uniaata.sys would be created: - one of them will operate in PnP mode with fixed (from OS's point of view) set of known devices - onother will be started in Legacy mode to handle all other recognizable controllers 2003.09.01 Version 0.25a (rar/tgz) - 157.5 Kb/192.6 Kb. I've found that broblem with onboard controllers was caused by PciIde.sys, which handles such controllers. Thus a simple installation BAT-file was created. It simply copies UniATA.sys, creates neccessary Keys in Registry and disabled PciIde driver. Now it works under w2k !!! Readme files are created for different platforms: w2k (readme_w2k.txt) and NT4 (readme_nt4.txt). Old version of NT4 readme is now called readme_nt4_old.txt. These files are moved to XXX_Dist directories. 2003.08.24 I've found, that even rahter old versions work under w2k. But with some restrictions: OS doesn't allow us to handle onboard (Native Mode) IDE, because in w2k IDE has its own miniport driver that differs from SCSI miniport. Now I'm thinking about the way of cheating the system to allow my driver representing Native Mode IDE controllers as SCSI devices. 2003.07.12 Version 0.25 (rar/tgz) - 155.2 Kb/187.5 Kb. Acard and nForce2 IDE DMA controllers support is added. Fixed bug with Promise IDE DMA support code. DMA mode check is added before accessing controller registers 2003.06.03 Version 0.24 (rar/tgz) - 153.1 Kb/185.2 Kb. Disabled DMA for ATAPI devices on ServerWorks controllers. It doesn't work :( Fixed bug with very old HDDs those don't support SET_GEOMETRY feature. Fixed bug with using DWordIO (32bit) on very old HDDs those report such capability, but can't operate in this mode I tried to run this under w2k. It doesn't work. 2003.02.15 Version 0.23e (rar/tgz) - 152.8 Kb/184.9 Kb. Code for handling some unusual devices (Yamaha-CRW2100) those like generating Unexpected Interrupt durring initialization process. (They do it a little later than I expected). 2002.11.25 Version 0.23d (rar/tgz) - 152.8 Kb/184.9 Kb. Fixed bug in .INF file .INF files together with uniata.sys are moved to Debug_Dist and Release_Dist directories new target PKG with parameter VER is added to idedma.mak. For example, current version with Dist directories was build using the following command: nmake PKG VER="23d_ok" new installation instruction can be found inside archive. 2002.11.14 Version 0.23c (rar/tgz) - 155.4 Kb/188.9 Kb. I've fixed a very big and fat bug, that could bring the computer down when executing DSC-restrictive commands (Such as SEEK, PLAY_CD, immediate LOAD/UNLOAD, etc.). Is was found on attempt to play Audio-CD. This bug could also lead to non-oparated state of dual-channel controllers. (when both channels are visible via single PCI device). .INF files are moved to Debug and Release directories for corresponding build installation. 2002.11.04 Version 0.23 (rar/tgz) - 147.3 Kb/176.6 Kb. But you should not use it. It is buggy ;). There is better one: 0.23b BusMaster_v23b_ok.rar/tgz (148.9 Kb/198.7 Kb) It is good enough, but I've not publish it yet.... Already done!!! Here it is: BusMaster_v23b_ok.rar Controllers initialization code is optimizad for minimal size. I've created independent command queues for Master and Slave devices. Now command reordering is performed separately for each device, thus, it is more efficient. The queue to be serviced for the next time is chosen according to special algorithm. Currently it looks at queue size only, but I'm going to make something more clever in nearest future. Installation .INF file is added (in Dist directory) 2002.10.11(29) Version 0.22b (rar/tgz) - 146.1 Kb/173.5 Kb. It is a little less buggy VIA-compatible chipset initialization code has been fixed. Now we handle the case of an unknown Revision Id properly. Controller list initialization code has been fixed. There were a bug with NULL-pointers. I've implement 'human-friendly' ;) algorithm of transfer rate slow-down when we have too high CRC Error-rate. Now driver don't switch device to PIO mode immediately. It probes slower modes until suitable one is found. The mode is assumed to be suitable if it shows much better results. If such mode can be found the device is switched to use this mode permanently. This technology solves problem with 40-cond. cables instead of 80-cond. one for UDMA66+ capable devices those don't set cable type bit properly in IDENTIFY_INFORMATION. 2002.10.10 Wow again! I've got new version BusMaster_v21d_ok.rar/tgz (87.8 Kb/108.2 Kb) (v 0.21d). I would be thankful to everyone who takes it for testing and tell me where it works and where it doesn't. DMA/UDMA support for ATAPI devices is added. The technology of working with controllers those have 2 channels available via single PCI device was dramatically changed. NT designers assumed that device can't interrupt until its previous interrupt is serviced. Thus, we can't programm one channel until transfer is completed on another channel. I've used a kind of workaround. (New DeviceObject connected to the same interrupt is created. It receives and queues interrupts from another channel). IO request queue sorting by LBA is implemented. Huge directory tree scan works about 8% faster (6.00 min -> 5.30) even in multithread tests with different start directories. I've also tried transfer rates for simple copy, but the results were unstable. The experiments with sorting algorithm will go on. 2002.09.16 Wow! I've got working version BusMaster_v13b_ok.rar/tgz (97.4 Kb/112.6 Kb) (v 0.13b). that understand what is DMA. DMA Engine is enabled and works now!!! Some minor bugs in Primary/Secondary initialization on a single controller are fixed. Generic DMA (Single Word DMA, mode 0) support is added for the case when other DMA modes can't be initialized (for ex. on unknown controller model). According to IDE BusMaster specification, the controller must automatically stitch to this mode after power on or reset. Device response wait timeout was changed from 5 to 0.05 sec in interrupt handler. It is wrong - blocking interrupts / thread switching when device hangs. Especially because it is possible (and even recomended by Microsoft) to avoid such waits. 2002.06.25 Version 0.9 (rar/tgz) - 54.1 Kb/62.1 Kb. New (I think, ideologically right) algorithm of device search and initialization is implemented. Some bugs with initialization of MasterIde controller (this is one that is onboard and usually works via ISA-to-PCI bridge). I was surprised that we can't communicate with it via PCI bus. Though it is visible there, neither IRQ nor IO-range is allocated (I suspect it was done for some kind of compatibility) We should use the following standard (predefined) IRQ/IO-ranges instead: Primary channel - IRQ 14 / IO 0x1f0 Secondary channel - IRQ 15 / IO 0x170 2002.06.01 I've found an interesting thing: some HDDs (in particular my Seagate Barracuda ATA 4) report their capacity as 32Gb by default. Thus, we should use special command to determine its right capacity (see ATA specifications, keyword="READ/SET NATIVE MAX LBA") 2002.05.28 Please, send your comments and propositions here: alterX@alter.org.ua (remove X) |
<< Back |  | designed by Alter aka Alexander A. Telyatnikov |  | powered by Apache+PHP under FBSD |  | © 2002–2005