 |
Universal ATA driver for Windows NT4/2000/XP
Updated
2005.03.24
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)
|
 |