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
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
    d) ServerWorks
    e) CMD 64x
    f) SiS
    g) AcerLabs Aladdin IV/V
    h) Intel
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.
