1.  use ScsiPortGetBusData() instead of HalGetBusData() to enumerate    ...
    PCI devices                                                        (8b )
2.  create 2 channels on non-primary HBA                               (9  )
3.  add BusMaster detection to ISA & ISA/PCI FindController() routines  ...
    I've decided to modify AtapiFindBusMasterController() for this      ...
    purpose                                                            (9  )
4.  beautify sources ;)
5.  add LBA support                                                    (8  )
6.  return modified Cylinders in IDENTYFY_DATA to handle HDDs > 8Gb     ...
    properly                                                           (8  )
7.  return good HDD size value for                                      ...
    a) IdeVerify()                                                     (8  )
    b) SCSIOP_READ_CAPACITY                                            (8  )
8.  use READ_NATIVE_SIZE command to determine actual drive capacity    (8a )
9.  send FLUSH command to device                                       (9  )
10. check (IO_WDx - 0x08) ports in AtapiFindBusMasterController()      (+++)
11. use SelectDrive() instead of ScsiPortWritePortXXX()                (9a )
12. remove obsolete AtapiFindPCIController()                           (9a )
13. make a separate routine AtapiInitController() for HBA               ...
    initialization (move there some parts of code from                  ...
    AtapiFindBusMasterController()                                     (---)
14. add feature enabling code to drive (re)init routine IdeHardReset()  ...
    AtapiHwInitialize() does all necessary staff                       (10+)
15, use AtapiInitController() in AtapiHwInitialize()                   (---)
16. remove obsolete FindBrokenController() and                          ...
    AtapiFindNativeModeController()                                    (10 )
17. move FindDevices() to id_probe.cpp                                 (10 )
18. set HDD PIO modes if no DMA available                              (10 )
19. implement AtaCommand()                                             (10 )
20. implement AtaPioMode() & AtaPio2Mode()                             (10 )
21. add some new ChipSets support from FBSD 4.5                        (10a)
22. set Controller PIO timigs                                           ...
    a) via                                                             (11 ) ??
    b) intel                                                           (+++)
    c) AcerLabs Aladdin IV/V                                           (23 )
23. update Identify block                                              (11 )
24. add LBA-48 support                                                 (11 )
25. use AtapiCommand()/AtapiCommand48() instead of direct port I/O      ...
    a) for Read/Write/Identify                                         (11 )
    b) Set features, Smart, Set drive params                           (11c)
26. port/implement AtapiDmaInit() for well-known controllers           (11 )
27. Beautify IdeReadWrite()                                            (11c)
28. port/implement DMA-specific parts of interrupt handlers            (12 )
29. request queueing                                                   (16b)
30. port/implement DMA-start routine                                   (12 )
31. remove MODE_SENSE/SELECT 6<->10 translation. It'll improve          ...
    performance.                                                       (11a)
32. move InterruptService to DPC (via ScsiPortNotification())          (17 )
33. implement ATA_WAIT_INTR branch in AtapiCommand()/AtapiCommand48()  (11b)
34. fix bugs in Identify structure                                     (11b)
35. use normal Lba detection in IssueIdentify()                        (11b)
36. fix bug with default structure elements alignment                   ...
    use pragma pack (1)                                                (11c)
37. use ATA_WAIT_INTR in IdeReadWrite() for Write branch and            ...
    ATA_IMMEDIATE for Read one                                         (11c)
38. update Identify dtructure                                          (11c)
39. fix some size detection bugs in IssueIdentify()                    (11c)
40. don't forget setting ExpectingInterrupt flag before WriteBuffer()   ...
    on PIO transfer                                                    (12g)
41. try generic DMA for old devices instead of PIO default             (12g)
42. clear 4 lower bits of AccessRange                                  (12g)
43. reconstruct _Original_ ConfigInfo (not temporary) on Detect         ...
    phase                                                              (13 )
44. set 32-bit addressing for all bus types                            (13 )
45. handle invalid address value (-1) in AtapiDmaSetup()               (13 )
46. add some new ChipSets support from FBSD 4.6                        (13c)
47. add 'offset' parameter to AtapiGetIoRange() to allow claiming       ...
    different io-regions of the same PCI device by different            ...
    DeviceObjects (representing different channels of this device      (13a)
48. claim both BusMaster io-regions on SimplexOnly controllers         (+++)
49. add ATAPI DMA support                                              (19 )
50. read 'PSS ID Number: Q133706' in NT DDK & implement Registry-       ...
    supplied params. Use a small hack instead: Argument2 is the         ...
    pointer to UNICODE_STRING we need                                  (18a)
51. implement Reinitialize functionality                               (+++)
52. optimize DMA init (move similar parts of code to loops/functions    ...
    a) VIA/AMD/nVidia                                                  (13c)
    b) Promise TX2                                                     (13c)
    c) Promise Ultra                                                   (23 )
    d) ServerWorks                                                     (23 )
    e) CMD 64x                                                         (+++)
    f) SiS                                                             (+++)
    g) AcerLabs Aladdin IV/V                                           (+++)
    h) Intel                                                           (+++)
    i) Sil                                                             (23 )
    j) HPT                                                             (23 )
53. use LogicalUnitExtension instead of xxx[Srb->TargetId]             (14 )
54. use SrbExtension to manage queue                                   (16b)
55. IdeReadWrite() should support non-zero initial offset in DataBuffer ...
    to allow scatter/gather simulation, queueing & retries
56. keep 'dma_tab' in SrbExtension                                     (16b)
57. never set SpecificLuExtensionSize to 0                             (14a)
58. never call ScsiPortGetUncachedExtension() twice for the same HBA,   ...
    even if the 1st call failed. Use deviceExtension->HbaCtrlFlags &    ...
    HBAFLAGS_DMA_DISABLED to indicate such case                        (16 )
59. set deviceExtension->BaseIoAddressBM[1] properly for dual-channel   ...
    HBAs (it was equal to BaseIoAddressBM[0])                          (16 )
60. set Channel properly in AtapiInterrupt__() for dual-channel HBAs    ...
    (lChannel was ignored)                                             (16 )
61. initialize ConfigINfo members required by                           ...
    ScsiPortGetUncachedExtension() _before_ call to AtapiDmaAlloc()    (16 )
62. move SCSI-address-2-Channel/Device translation to macros. This      ...
    makes code more readable & flexible.                               (16 )
63. implement SCSI-bus - IDE-channel and                                ...
    SCSI-TargetId - IDE-master/slave correspondance (using p.62)       (16 )
64. set AutoRequestSense to TRUE                                       (16a)
65. set inquiryData->CommandQueue to 1                                 (16a)
66. fill SenseInfoBufer in                                              ...
    a) IDE MapError()                                                  (16a)
    b) IDE/ATAPI success                                               (20d)
67. use AtaReq->ReqState to indicate request processing state          (16b)
68. fill AtaReq->ReqState in all necessary places to reflect actual     ...
    request state (for optimizer)                                      (18+)
69. fix bug with unconditional returning FALSE in AtapiInterrupt()     (16c)
70. copy pointer to original AtaReq from Srb to InternalSrb            (16c)
71. check input Srb value for NULL in AtapiRemoveRequest()             (16c)
72. return from IssueIdentify loop if no error occured. Previous        ...
    versions have a bug: SUCCESS status was ignored & this caused       ...
    obsolet retries                                                    (16c)
73. clear CTRFLAGS_INTR_DISABLED flag in AtapiEnableInterrupts_Xxx()   (17a)
74. use Sync Object to manage access to request queue                  (---)
75. remove AtapiEnableInterrupts_Xxx()-related code duplicates from     ...
    AtapiInterrupt__()                                                 (17a)
76. check calls to AtapiResetController() & related routines.           ...
    See p. 80, 81                                                      (+++)
77. use ScsiPortNotification() with RequestTimerCall instead of         ...
    CallDis(En)ableInterrupts to allow servicing 2 channels in          ...
    parallel. See p.87                                                 (---)
78. do not use DPC ISR for fast operations, like                        ...
    a) DMA-completion                                                  (18 )
    b) sending CDB to ATAPI devices                                    (18a)
    c) short ATAPI transfers                                           (18a)
79. call both AtapiEnableInterrupts_X() & AtapiCallBack_X() on DSC      ...
    restrictive commands completion                                    (18 )
80. invoke AtapiStartIo__() from ISR as callback to parform it's        ...
    execution at lower IRQL                                            (19x)
81. invoke AtapiResetController() from ISR as callback to parform it's  ...
    execution at lower IRQL                                            (19x)
82. do not use ScsiPortCompleteRequest() in AtapiResetController()      ...
    Use standard completion way with setting SenseData instead         (18a)
83. reset single channel on normal (non-simplex-only) controllers in    ...
    AtapiResetController()                                             (18a)
84. sort records in BMList on enumeration phase & simplify init loops   ...
    in DriverEntry()                                                   (18a)
85. fix bug with wrong numberChannels init for 2nd channel in           ...
    AtapiResetController()                                             (18b)
86. implement channel-sensetive AtapiHwInitialize__() and use in in     ...
    AtapiResetController() & AtapiHwInitialize()                       (18+)
87. Due to SCSI-port restrictions we should Enable/Disable interruptys  ...
    for BOTH channels :((((. Implement this....                        (19 )
88. Deprecate p.87. ;) It doesn't work. Solution: connect manually      ...
    created DeviceObject to the same interrupt & check in its ISR if    ...
    our device interrupted while original ISR/DPC processing            ...
    another channel's interrupt.                                       (20 )
90. add error handling on additional DevObj init                       (20a)
91. deprecate p.80,81. We should acquire QueueSpinLock at DIRQL        (+/-)
92. perform all possible request init on queueing stage even if we      ...
    can't send it to device immediately (use CMD_ACTION_XXX)            ...
    a) for IDE branch                                                  (20c)
    b) for ATAPI branch                                                (21a)
93. complete the following commands immediately:                        ...
    SCSIOP_INQUIRY, SCSIOP_READ_CAPACITY, SCSIOP_REQUEST_SENSE         (20c)
94. implement ABORT_COMMAND functionality                              (20d)
95. reorder incoming requests in AtapiQueueRequest()                   (21c)
96. make 2 modes for ResetController(): complete current & complete     ...
    all for p.94.                                                      (20d)
97. store queue size statistics in HW_CHANNEL                          (20d)
98. remove obsolete DPC code from AtapiInterrupt__()                   (20e)
99. store error rate in HW_CHANNEL                                     (20e)
100.try falling back to PIO when DMA error occured                     (20e)
101.use Dma & Pio error rates to distinguish between BadBlock &         ...
    BadCable conditions, See also p.127, 128                           (+++)
102.don't use HDD's algorithm of falling back to PIO for ATAPI         (21 )
103.clear REQ_FLAG_DMA_OPERATION when falling back to PIO              (21 )
104.set REQ_FLAG_REORDERABLE_CMD in IdeReadWrite()                     (21 )
105.store bcount along with lba in ATA_REQ on CMD_ACTION_PREPARE stage (21 )
106.do like p.105,104 in AtapiSendCommand for read/write ops           (21 )
107.set operation type flag (Read/Write) in AtaReq on                   ...
    CMD_ACTION_PREPARE stage                                           (21b)
108.send comamnds to queue _after_ CMD_ACTION_PREPARE stage            (21a)
109.fix bug (incorrect queue_size check) in p.108                      (21b)
110.handle SRB_FLAGS_DISABLE_AUTOSENSE
111.handle Srb->QueueAction                                            (21d)
112.check SRB_STATUS_AUTOSENSE_VALID usage policy                      (+++)
113.add support for hardware queueing/overlapped commands
114.handle immediate commands properly: don't initiate bus reset        ...
    while formatting CDRW                                              (+++)
115.add hardware IDE RAID support
116.fix bug with data type missmatch in AtapiDmaInit(),                 ...
    some VIA branches. This bug caused array boundary cross, leading    ...
    to system crash                                                    (22 )
117.default udmamode to 0 if there are no well-known devices found      ...
    in AtapiDmaInit(), VIA branch.                                     (22 )
118.do not check RevID in AtapiFindDev if RevID == -1                  (22 )
119.use best settings for newer RevIDs
120.fix signed/unsigned missmatch (i vs udmamode) in AtapiDmaInit(),    ...
    VIA branch                                                         (22 )
121.fix bug with incorrect UDMA init in VIA branch. use UDMA0+i         ...
    instead of UDMA0+udmamode                                          (22a)
122.fall back to WDMA mode before PIO                                  (22a)
123.use transfer speed slowdown algorithm when high error rate          ...
    detected                                                           (22a)
124.don't forget updating AtaReq->retry on R/W error (non-DMA)         (22a)
125.fill AtaReq with ZEROs on TopLevel condition                       (22a)
126.fix bug in IdeVerify() with sending SectorCount to device before    ...
    call to AtaCommand48() and using 0 SectorCount in that call        (22a)
127.store Error/Recover rate statistics in LunExtension                (22a)
128.use p.127 for smart slowdown algorithm                             (22b)
129.use lChannel  instead of phChannel for indexing in find-channel     ...
    loop in AtapiFindBusMasterController()                             (22b)
130.programm controller for lower speed in Ide/AtapiSendCommand(), not  ...
    in AtapiInterrupt__()                                              (22b)
131.use AtapiDmaReinit() routine for p.131                             (22b)
132.implement per-device queueing                                      (23 )
134.add Sil, ICH4, Some HPT, PromiseTX2(133) support from 4.7          (23 )
135.fix wrong bit-shift bug in lba48 branch                            (23 )
136.update and sort BusMasterAdapters[]                                (23a)
137.fix bugs in AtapiTimerDpc() that caused incorrect handling of       ...
    DSC restrictive commands                                            ...
    a) call ScsiPortNotification(RequestTimerCall, ...) when we had     ...
       a 2nd request on entry only                                     (23c)
    b) check HwScsiTimer1 first to decide whether we have to go to      ...
       GetNextDpc                                                      (23c)
    c) wrong condition check 'time <= DpcTime1' instead of              ...
       'time >= DpcTime1'                                              (23c)
    d) remove request from queue _before_ call to HwScsiTimer()        (23c)
138.add support for Acard controllers                                  (25 )
139.use some additional code for HP/Promise Dma Star/Stop              (25 )
140.assign queueing priority for each device
141.assign BusMaster io-range to 1st channel only.                     (26e)
142.do not change bus type to PCI for legacy ISA-PCI controllers under  ...
    NT4                                                                (28 )
143.implement Device/Vendor/Rev. filtering via registry keys           (30+)
144.implement transfer mode control IOCTLs                             (28 )
145.set max. transfer length > 64k.
146.implement fix for miss-aligned user buffer
147.set chip-specific init/operation flags only once during             ...
    initialization and use them in future. Do not perform multiple      ...
    bus scans and other detections.                                    (29a)
148.fix bug with miss-functioning Enable/Disable interrupt for         (+++)
    secondary channel                                                  (28 )
149.add serial-ATA support                                             (29a)
150.add support for new controllers (SiS, Promise)                     (29a)
151.fix detection/init algorithms in order to avoid usage of            ...
    non-generic code for unknown chips                                 (29a)
152.add support for >2 channels                                        (29a)
153.improve Intr-detection loop. Start each time from next channel      ...
    for load-balance                                                   (29a)
154.add support for machines with >4G physical memory                  (38 )
155.add FreeBSD software RAID support
156.use http://www.winimage.com/readfi15.zip for performance checks
157.use IOCTL_SCSI_MINIPORT_IDENTIFY in atactl.exe to determine         ...
    PIO/DMA when no uniata.sys is installed                            (+++)
158.implement .INF generator
159.fix bug with invalid INF section under XP+                         (43e2)
160.add INF handler for SCSI\NET\VEN_UNIATA&PROD_MANAGEMENT_PORT
161.