3 Copyright (c) 2002-2016 Alexander A. Telyatnikov (Alter)
9 This is the miniport driver for ATAPI IDE controllers
10 With Busmaster DMA support
13 Alexander A. Telyatnikov (Alter)
20 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 This module is a port from FreeBSD 4.3-6.1 ATA driver (ata-dma.c, ata-chipset.c) by
34 Søren Schmidt, Copyright (c) 1998-2008
36 Changed defaulting-to-generic-PIO/DMA policy
37 Added PIO settings for VIA
38 Optimized VIA/AMD/nVidia init part
39 Optimized Promise TX2 init part
40 Optimized Intel init part
41 by Alex A. Telyatnikov (Alter) (c) 2002-2007
51 static const ULONG valid_udma
[7] = {0,0,2,0,4,5,6};
53 static const CHAR retry_Wdma
[MAX_RETRIES
+1] = {2, 2, 2,-1,-1,-1};
54 static const CHAR retry_Udma
[MAX_RETRIES
+1] = {6, 2,-1,-1,-1,-1};
56 PHYSICAL_ADDRESS ph4gb
= {{0xFFFFFFFF, 0}};
61 IN PHW_DEVICE_EXTENSION deviceExtension
,
62 IN ULONG dev
, // physical device number (0-3)
69 IN PHW_DEVICE_EXTENSION deviceExtension
,
70 IN ULONG dev
, // physical device number (0-3)
77 IN PHW_DEVICE_EXTENSION deviceExtension
,
78 IN ULONG dev
, // physical device number (0-3)
85 IN PHW_DEVICE_EXTENSION deviceExtension
,
86 IN ULONG dev
, // physical device number (0-3)
93 IN PHW_DEVICE_EXTENSION deviceExtension
,
94 IN ULONG channel
// physical channel number (0-1)
100 IN PVOID HwDeviceExtension
,
101 IN PSCSI_REQUEST_BLOCK Srb
,
103 OUT PULONG count
, /* bytes */
107 PHYSICAL_ADDRESS ph_addr
;
110 *(volatile char*)data
; // Touch memory, this will prevent condition of not-ready page table for valid addresses
112 ph_addr
= MmGetPhysicalAddress(data
);
113 KdPrint3((PRINT_PREFIX
"AtapiVirtToPhysAddr_: %x -> %8.8x:%8.8x\n", data
, ph_addr
.HighPart
, ph_addr
.LowPart
));
114 if(!ph_addru
&& ph_addr
.HighPart
) {
115 // do so until we add 64bit address support
116 // or some workaround
121 (*ph_addru
) = ph_addr
.HighPart
;
122 //addr = ScsiPortConvertPhysicalAddressToUlong(ph_addr);
123 addr
= ph_addr
.LowPart
;
124 if(!addr
&& !ph_addr
.HighPart
) {
129 *count
= sizeof(BM_DMA_ENTRY
)*ATA_DMA_ENTRIES
;
131 *count
= PAGE_SIZE
- (addr
& (PAGE_SIZE
-1));
134 } // end AtapiVirtToPhysAddr_()
139 IN PVOID HwDeviceExtension
,
140 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
141 IN ULONG lChannel
// logical channel,
145 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
146 PHW_CHANNEL chan
= &(deviceExtension
->chan
[lChannel
]);
151 deviceExtension
->chan
[c
].CopyDmaBuffer
= FALSE
;
153 if(!deviceExtension
->Host64
&& (WinVer_Id() > WinVer_NT
)) {
154 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: allocate tmp buffers below 4Gb\n"));
156 KdPrint2((PRINT_PREFIX
" already initialized %x\n", chan
->DB_PRD
));
159 chan
->DB_PRD
= MmAllocateContiguousMemory(sizeof(((PATA_REQ
)NULL
)->dma_tab
), ph4gb
);
161 chan
->DB_PRD_PhAddr
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(chan
->DB_PRD
), &i
, &ph_addru
);
162 if(!chan
->DB_PRD_PhAddr
|| !i
|| ((LONG
)(chan
->DB_PRD_PhAddr
) == -1)) {
163 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB PRD BASE\n" ));
165 chan
->DB_PRD_PhAddr
= 0;
169 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB PRD below 4Gb\n" ));
173 chan
->DB_IO
= MmAllocateContiguousMemory(deviceExtension
->MaximumDmaTransferLength
, ph4gb
);
175 chan
->DB_IO_PhAddr
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(chan
->DB_IO
), &i
, &ph_addru
);
176 if(!chan
->DB_IO_PhAddr
|| !i
|| ((LONG
)(chan
->DB_IO_PhAddr
) == -1)) {
177 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB IO BASE\n" ));
179 MmFreeContiguousMemory(chan
->DB_PRD
);
181 chan
->DB_PRD_PhAddr
= 0;
183 chan
->DB_IO_PhAddr
= 0;
187 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB IO below 4Gb\n" ));
188 MmFreeContiguousMemory(chan
->DB_IO
);
195 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
196 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: AHCI\n" ));
197 if(chan
->AhciCtlBlock
) {
198 KdPrint2((PRINT_PREFIX
" already initialized %x\n", chan
->AhciCtlBlock
));
201 // Need 1K-byte alignment
202 chan
->AhciCtlBlock0
= (PIDE_AHCI_CHANNEL_CTL_BLOCK
)MmAllocateContiguousMemory(
203 sizeof(IDE_AHCI_CHANNEL_CTL_BLOCK
)+AHCI_CLB_ALIGNEMENT_MASK
,
205 if(chan
->AhciCtlBlock0
) {
208 ULONGLONG AhciCtlBlock64
;
211 AhciCtlBlock
= (PUCHAR
)chan
->AhciCtlBlock0
;
213 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: CLP BASE %I64x\n", AhciCtlBlock64
));
215 AhciCtlBlock64
+= AHCI_CLB_ALIGNEMENT_MASK
;
216 AhciCtlBlock64
&= ~AHCI_CLB_ALIGNEMENT_MASK
;
218 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: CLP BASE 1k-aligned %I64x\n", AhciCtlBlock64
));
220 chan
->AhciCtlBlock
= (PIDE_AHCI_CHANNEL_CTL_BLOCK
)AhciCtlBlock
;
222 chan
->AHCI_CTL_PhAddr
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(chan
->AhciCtlBlock
), &i
, &ph_addru
);
223 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: CLP Phys BASE %I64x\n", chan
->AHCI_CTL_PhAddr
));
224 if(!chan
->AHCI_CTL_PhAddr
|| !i
|| ((LONG
)(chan
->AHCI_CTL_PhAddr
) == -1)) {
225 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No AHCI CLP BASE\n" ));
226 chan
->AhciCtlBlock
= NULL
;
227 chan
->AHCI_CTL_PhAddr
= 0;
231 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No AHCI CLP below 4Gb\n" ));
232 MmFreeContiguousMemory(chan
->AhciCtlBlock0
);
233 chan
->AhciCtlBlock
= NULL
;
234 chan
->AHCI_CTL_PhAddr
= 0;
238 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: Can't alloc AHCI CLP\n"));
243 } // end AtapiDmaAlloc()
248 IN PVOID HwDeviceExtension
,
249 IN ULONG DeviceNumber
,
250 IN ULONG lChannel
, // logical channel,
251 IN PSCSI_REQUEST_BLOCK Srb
,
253 IN ULONG count
/* bytes */
256 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
257 ULONG dma_count
, dma_base
, dma_baseu
;
258 ULONG dma_count0
, dma_base0
;
260 PHW_CHANNEL chan
= &(deviceExtension
->chan
[lChannel
]);
261 PATA_REQ AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
262 BOOLEAN use_DB_IO
= FALSE
;
263 BOOLEAN use_AHCI
= (deviceExtension
->HwFlags
& UNIATA_AHCI
) ? TRUE
: FALSE
;
264 ULONG orig_count
= count
;
265 ULONG max_entries
= use_AHCI
? ATA_AHCI_DMA_ENTRIES
: ATA_DMA_ENTRIES
;
266 //ULONG max_frag = use_AHCI ? (0x3fffff+1) : (4096); // DEBUG, replace 4096 for proper chipset-specific value
267 ULONG max_frag
= deviceExtension
->DmaSegmentLength
;
268 ULONG seg_align
= deviceExtension
->DmaSegmentAlignmentMask
;
270 if(AtaReq
->dma_entries
) {
271 AtaReq
->Flags
|= REQ_FLAG_DMA_OPERATION
;
272 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: already setup, %d entries\n", AtaReq
->dma_entries
));
275 AtaReq
->ata
.dma_base
= 0;
276 AtaReq
->Flags
&= ~REQ_FLAG_DMA_OPERATION
;
278 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: mode %#x, data %x, count %x, lCh %x, dev %x\n",
279 chan
->lun
[DeviceNumber
]->TransferMode
,
280 data
, count
, lChannel
, DeviceNumber
));
281 if(chan
->lun
[DeviceNumber
]->TransferMode
< ATA_DMA
) {
282 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: Not DMA mode, assume this is just preparation\n" ));
285 //KdPrint2((PRINT_PREFIX " checkpoint 1\n" ));
287 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: count=0\n" ));
290 //KdPrint2((PRINT_PREFIX " checkpoint 2\n" ));
291 if(count
> deviceExtension
->MaximumDmaTransferLength
) {
292 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: deviceExtension->MaximumDmaTransferLength > count\n" ));
295 //KdPrint2((PRINT_PREFIX " checkpoint 3\n" ));
296 if((ULONG_PTR
)data
& deviceExtension
->AlignmentMask
) {
297 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: unaligned data: %#x (%#x)\n", data
, deviceExtension
->AlignmentMask
));
301 //KdPrint2((PRINT_PREFIX " checkpoint 4\n" ));
303 KdPrint2((PRINT_PREFIX
" get Phys(AHCI_CMD=%x)\n", AtaReq
->ahci
.ahci_cmd_ptr
));
304 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(AtaReq
->ahci
.ahci_cmd_ptr
), &i
, &dma_baseu
);
305 AtaReq
->ahci
.ahci_base64
= 0; // clear before setup
307 KdPrint2((PRINT_PREFIX
" get Phys(PRD=%x)\n", &(AtaReq
->dma_tab
) ));
308 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)&(AtaReq
->dma_tab
) /*chan->dma_tab*/, &i
, &dma_baseu
);
311 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: SRB built-in PRD above 4Gb: %8.8x%8.8x\n", dma_baseu
, dma_base
));
312 if(!deviceExtension
->Host64
) {
313 dma_base
= chan
->DB_PRD_PhAddr
;
314 AtaReq
->Flags
|= REQ_FLAG_DMA_DBUF_PRD
;
318 if(!dma_base
|| !i
|| ((LONG
)(dma_base
) == -1)) {
319 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: No BASE\n" ));
322 AtaReq
->ata
.dma_base
= dma_base
; // aliased to AtaReq->ahci.ahci_base64
324 KdPrint2((PRINT_PREFIX
" get Phys(data[0]=%x)\n", data
));
325 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, Srb
, data
, &dma_count
, &dma_baseu
);
326 if(dma_baseu
&& dma_count
) {
327 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: 1st block of buffer above 4Gb: %8.8x%8.8x cnt=%x\n", dma_baseu
, dma_base
, dma_count
));
328 if(!deviceExtension
->Host64
) {
331 dma_base
= chan
->DB_IO_PhAddr
;
332 data
= (PUCHAR
)(chan
->DB_IO
);
334 AtaReq
->ahci
.ahci_base64
= (ULONGLONG
)dma_base
| ((ULONGLONG
)dma_baseu
<< 32);
337 if(!dma_count
|| ((LONG
)(dma_base
) == -1)) {
338 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: No 1st block\n" ));
339 //AtaReq->dma_base = NULL;
340 AtaReq
->ahci
.ahci_base64
= NULL
;
344 dma_count
= min(count
, (PAGE_SIZE
- ((ULONG_PTR
)data
& PAGE_MASK
)));
349 dma_count0
= dma_count
;
350 dma_base0
= dma_base
;
353 /* KdPrint2((PRINT_PREFIX " segments %#x+%#x == %#x && %#x+%#x <= %#x\n",
354 dma_base0, dma_count0, dma_base,
355 dma_count0, dma_count, max_frag));*/
356 if(dma_base0
+dma_count0
== dma_base
&&
357 dma_count0
+dma_count
<= max_frag
) {
358 // 'i' should be always > 0 here
359 // for BM we cannot cross 64k boundary
360 if(dma_base
& seg_align
) {
361 //KdPrint2((PRINT_PREFIX " merge segments\n" ));
365 dma_base
= dma_base0
;
366 dma_count
+= dma_count0
;
370 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].base
= dma_base
;
371 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].baseu
= dma_baseu
;
372 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].Reserved1
= 0;
373 *((PULONG
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC_ULONG
)) = ((dma_count
-1) & 0x3fffff);
374 /* AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved2 = 0;
375 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].I = 0;*/
376 KdPrint2((PRINT_PREFIX
" ph data[%d]=%x:%x (%x)\n", i
, dma_baseu
, dma_base
, AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC
));
378 AtaReq
->dma_tab
[i
].base
= dma_base
;
379 AtaReq
->dma_tab
[i
].count
= (dma_count
& 0xffff);
381 dma_count0
= dma_count
;
382 dma_base0
= dma_base
;
384 if (i
>= max_entries
) {
385 KdPrint2((PRINT_PREFIX
"too many segments in DMA table\n" ));
386 //AtaReq->dma_base = NULL;
387 AtaReq
->ahci
.ahci_base64
= NULL
;
390 KdPrint2((PRINT_PREFIX
" get Phys(data[n=%d+%x]=%x)\n", i
, dma_count0
, data
));
391 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, Srb
, data
, &dma_count
, &dma_baseu
);
392 if(dma_baseu
&& dma_count
) {
393 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: block of buffer above 4Gb: %8.8x%8.8x, cnt=%x\n", dma_baseu
, dma_base
, dma_count
));
394 if(!deviceExtension
->Host64
) {
396 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: *ERROR* special buffer above 4Gb: %8.8x%8.8x\n", dma_baseu
, dma_base
));
403 if(!dma_count
|| !dma_base
|| ((LONG
)(dma_base
) == -1)) {
404 //AtaReq->dma_base = NULL;
405 AtaReq
->ahci
.ahci_base64
= 0;
406 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: No NEXT block\n" ));
410 dma_count
= min(count
, PAGE_SIZE
);
411 data
+= min(count
, PAGE_SIZE
);
412 count
-= min(count
, PAGE_SIZE
);
414 KdPrint2((PRINT_PREFIX
" set TERM\n" ));
415 /* KdPrint2((PRINT_PREFIX " segments %#x+%#x == %#x && #x+%#x <= %#x\n",
416 dma_base0, dma_count0, dma_base,
417 dma_count0, dma_count, max_frag));*/
418 if(dma_base0
+dma_count0
== dma_base
&&
419 dma_count0
+dma_count
<= max_frag
) {
420 // 'i' should be always > 0 here
421 if(dma_base
& seg_align
) {
422 //KdPrint2((PRINT_PREFIX " merge segments\n" ));
426 dma_base
= dma_base0
;
427 dma_count
+= dma_count0
;
431 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].base
= dma_base
;
432 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].baseu
= dma_baseu
;
433 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].Reserved1
= 0;
434 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].DBC = ((dma_count-1) & 0x3fffff);
435 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved2 = 0;
436 *((PULONG
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC_ULONG
)) = ((dma_count
-1) & 0x3fffff);
437 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].I = 1; // interrupt when ready
438 KdPrint2((PRINT_PREFIX
" ph data[%d]=%x:%x (%x)\n", i
, dma_baseu
, dma_base
, AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC
));
439 if(((ULONG_PTR
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
) & ~PAGE_MASK
) != ((ULONG_PTR
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
]) & ~PAGE_MASK
)) {
440 KdPrint2((PRINT_PREFIX
"PRD table crosses page boundary! %x vs %x\n",
441 &AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
, &(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
]) ));
442 //AtaReq->Flags |= REQ_FLAG_DMA_DBUF_PRD;
445 AtaReq
->dma_tab
[i
].base
= dma_base
;
446 AtaReq
->dma_tab
[i
].count
= (dma_count
& 0xffff) | ATA_DMA_EOT
;
447 if(((ULONG_PTR
)&(AtaReq
->dma_tab
) & ~PAGE_MASK
) != ((ULONG_PTR
)&(AtaReq
->dma_tab
[i
]) & ~PAGE_MASK
)) {
448 KdPrint2((PRINT_PREFIX
"DMA table crosses page boundary! %x vs %x\n",
449 &AtaReq
->dma_tab
, &(AtaReq
->dma_tab
[i
]) ));
450 //AtaReq->Flags |= REQ_FLAG_DMA_DBUF_PRD;
453 AtaReq
->dma_entries
= i
+1;
456 AtaReq
->Flags
|= REQ_FLAG_DMA_DBUF
;
458 AtaReq
->Flags
|= REQ_FLAG_DMA_OPERATION
;
460 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: OK\n" ));
463 } // end AtapiDmaSetup()
468 PVOID HwDeviceExtension
,
469 PSCSI_REQUEST_BLOCK Srb
,
475 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
482 // This must never be called after DMA operation !!!
483 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: data %#x, len %#x\n", data
, count
));
486 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !Srb\n" ));
490 AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
492 // do nothing on PCI (This can be changed. We cannot guarantee,
493 // that CommonBuffer will always point to User's buffer,
494 // however, this usually happens on PCI-32)
495 if(deviceExtension
->OrigAdapterInterfaceType
== PCIBus
) {
498 // do nothing for DMA
499 if(AtaReq
->Flags
& REQ_FLAG_DMA_OPERATION
) {
504 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !data\n" ));
509 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, Srb
, data
, &dma_count
);
511 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !dma_base for data %#x\n", data
));
514 DmaBuffer
= (PUCHAR
)ScsiPortGetVirtualAddress(HwDeviceExtension
,
515 ScsiPortConvertUlongToPhysicalAddress(dma_base
));
517 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !DmaBuffer for dma_base %#x\n", dma_base
));
520 len
= min(dma_count
, count
);
521 memcpy(DmaBuffer
, data
, len
);
528 } // end AtapiDmaPioSync()
534 PSCSI_REQUEST_BLOCK Srb
539 AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
540 if((Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) &&
541 (AtaReq
->Flags
& REQ_FLAG_DMA_DBUF
)) {
542 KdPrint2((PRINT_PREFIX
" AtapiDmaDBSync is issued.\n"));
544 KdPrint2((PRINT_PREFIX
" DBUF (Read)\n"));
545 RtlCopyMemory(AtaReq
->DataBuffer
, chan
->DB_IO
,
546 Srb
->DataTransferLength
);
549 } // end AtapiDmaDBSync()
554 IN PVOID HwDeviceExtension
,
556 PSCSI_REQUEST_BLOCK Srb
559 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
560 PATA_REQ AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
562 if(!AtaReq
->ata
.dma_base
) {
563 KdPrint2((PRINT_PREFIX
"AtapiDmaDBPreSync: *** !AtaReq->ata.dma_base\n"));
566 // GetStatus(chan, statusByte2);
567 if(AtaReq
->Flags
& REQ_FLAG_DMA_DBUF_PRD
) {
568 KdPrint2((PRINT_PREFIX
" DBUF_PRD\n"));
570 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
571 RtlCopyMemory(chan
->DB_PRD
, AtaReq
->ahci
.ahci_cmd_ptr
, sizeof(AtaReq
->ahci_cmd0
));
573 RtlCopyMemory(chan
->DB_PRD
, &(AtaReq
->dma_tab
), sizeof(AtaReq
->dma_tab
));
576 if(!(Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) &&
577 (AtaReq
->Flags
& REQ_FLAG_DMA_DBUF
)) {
578 KdPrint2((PRINT_PREFIX
" DBUF (Write)\n"));
580 RtlCopyMemory(chan
->DB_IO
, AtaReq
->DataBuffer
,
581 Srb
->DataTransferLength
);
584 } // end AtapiDmaDBPreSync()
589 IN PVOID HwDeviceExtension
,
590 IN ULONG DeviceNumber
,
591 IN ULONG lChannel
, // logical channel,
592 IN PSCSI_REQUEST_BLOCK Srb
595 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
596 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM = deviceExtension->BaseIoAddressBM[lChannel];
597 PATA_REQ AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
598 PHW_CHANNEL chan
= &deviceExtension
->chan
[lChannel
];
600 ULONG VendorID
= deviceExtension
->DevID
& 0xffff;
601 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
602 // UCHAR statusByte2;
604 GetStatus(chan, statusByte2);
605 KdPrint2((PRINT_PREFIX "AtapiDmaStart: %s on %#x:%#x\n",
606 (Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? "read" : "write",
607 lChannel, DeviceNumber ));
609 if(!AtaReq
->ata
.dma_base
) {
610 KdPrint2((PRINT_PREFIX
"AtapiDmaStart: *** !AtaReq->ata.dma_base\n"));
613 KdPrint2((PRINT_PREFIX
"AtapiDmaStart: lchan=%d\n", lChannel
));
616 // GetStatus(chan, statusByte2);
617 if(AtaReq->Flags & REQ_FLAG_DMA_DBUF_PRD) {
618 KdPrint2((PRINT_PREFIX " DBUF_PRD\n"));
620 if(deviceExtension->HwFlags & UNIATA_AHCI) {
621 RtlCopyMemory(chan->DB_PRD, AtaReq->ahci.ahci_cmd_ptr, sizeof(AtaReq->ahci_cmd0));
623 RtlCopyMemory(chan->DB_PRD, &(AtaReq->dma_tab), sizeof(AtaReq->dma_tab));
626 if(!(Srb->SrbFlags & SRB_FLAGS_DATA_IN) &&
627 (AtaReq->Flags & REQ_FLAG_DMA_DBUF)) {
628 KdPrint2((PRINT_PREFIX " DBUF (Write)\n"));
630 RtlCopyMemory(chan->DB_IO, AtaReq->DataBuffer,
631 Srb->DataTransferLength);
635 chan
->ChannelCtrlFlags
|= CTRFLAGS_DMA_ACTIVE
;
639 if(ChipType
== PRNEW
) {
640 ULONG Channel
= deviceExtension
->Channel
+ lChannel
;
642 if(chan
->ChannelCtrlFlags
& CTRFLAGS_LBA48
) {
643 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(Channel
? 0x24 : 0x20),
644 ((Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) ? 0x05000000 : 0x06000000) | (Srb
->DataTransferLength
>> 1)
649 if(deviceExtension->MemIo) {
651 AtapiWritePort4(chan,
653 (AtapiReadPort4(chan,
654 IDX_BM_Command) & ~0x000000c0) |
655 ((Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? 0x00000080 : 0x000000c0) );
662 // set pointer to Pointer Table
663 AtapiWritePort4(chan
, IDX_BM_PRD_Table
,
666 // set transfer direction
667 AtapiWritePort1(chan
, IDX_BM_Command
,
668 (Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) ? BM_COMMAND_READ
: BM_COMMAND_WRITE
);
669 // clear Error & Intr bits (writeing 1 clears bits)
670 // set DMA capability bit
671 AtapiWritePort1(chan
, IDX_BM_Status
,
672 AtapiReadPort1(chan
, IDX_BM_Status
) |
673 (BM_STATUS_INTR
| BM_STATUS_ERR
) /*|
674 (DeviceNumber ? BM_STATUS_DRIVE_1_DMA : BM_STATUS_DRIVE_0_DMA)*/);
676 AtapiWritePort1(chan
, IDX_BM_Command
,
677 AtapiReadPort1(chan
, IDX_BM_Command
) |
678 BM_COMMAND_START_STOP
);
681 } // end AtapiDmaStart()
686 IN PVOID HwDeviceExtension
,
687 IN ULONG DeviceNumber
,
688 IN ULONG lChannel
, // logical channel,
689 IN PSCSI_REQUEST_BLOCK Srb
692 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
693 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM = deviceExtension->BaseIoAddressBM[lChannel];
694 PHW_CHANNEL chan
= &deviceExtension
->chan
[lChannel
];
697 ULONG VendorID
= deviceExtension
->DevID
& 0xffff;
698 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
700 KdPrint2((PRINT_PREFIX
"AtapiDmaDone: dev %d\n", DeviceNumber
));
702 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
703 KdPrint2((PRINT_PREFIX
" ACHTUNG! should not be called for AHCI!\n"));
704 return IDE_STATUS_WRONG
;
709 if(ChipType
== PRNEW
) {
710 ULONG Channel
= deviceExtension
->Channel
+ lChannel
;
712 AtapiWritePortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11,
713 AtapiReadPortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11) &
714 ~(Channel ? 0x08 : 0x02));
716 if(chan
->ChannelCtrlFlags
& CTRFLAGS_LBA48
) {
717 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(Channel
? 0x24 : 0x20),
723 if(deviceExtension->MemIo) {
725 AtapiWritePort4(chan,
727 (AtapiReadPort4(chan,
728 IDX_BM_Command) & ~0x00000080) );
730 chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_ACTIVE;
738 dma_status
= AtapiReadPort1(chan
, IDX_BM_Status
) & BM_STATUS_MASK
;
740 AtapiWritePort1(chan
, IDX_BM_Command
,
741 AtapiReadPort1(chan
, IDX_BM_Command
) &
742 ~BM_COMMAND_START_STOP
);
743 // clear interrupt and error status
744 AtapiWritePort1(chan
, IDX_BM_Status
, BM_STATUS_ERR
| BM_STATUS_INTR
);
746 chan
->ChannelCtrlFlags
&= ~CTRFLAGS_DMA_ACTIVE
;
750 } // end AtapiDmaDone()
755 IN PHW_DEVICE_EXTENSION deviceExtension
,
756 IN PHW_LU_EXTENSION LunExt
,
762 if((deviceExtension
->HwFlags
& UNIATA_AHCI
) &&
763 !(LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
)) {
764 // skip unnecessary checks
765 KdPrint2((PRINT_PREFIX
"AtapiDmaReinit: ahci, nothing to do for HDD\n"));
769 apiomode
= (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
));
771 if(!(AtaReq
->Flags
& REQ_FLAG_DMA_OPERATION
)) {
772 KdPrint2((PRINT_PREFIX
773 "AtapiDmaReinit: !(AtaReq->Flags & REQ_FLAG_DMA_OPERATION), fall to PIO on Device %d\n", LunExt
->Lun
));
776 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
777 if(!AtaReq
->ahci
.ahci_base64
) {
778 KdPrint2((PRINT_PREFIX
779 "AtapiDmaReinit: no AHCI PRD, fatal on Device %d\n", LunExt
->Lun
));
783 if(!AtaReq
->ata
.dma_base
) {
784 KdPrint2((PRINT_PREFIX
785 "AtapiDmaReinit: no PRD, fall to PIO on Device %d\n", LunExt
->Lun
));
789 if((deviceExtension
->HbaCtrlFlags
& HBAFLAGS_DMA_DISABLED_LBA48
) &&
790 (AtaReq
->lba
>= (LONGLONG
)ATA_MAX_LBA28
) &&
791 (LunExt
->TransferMode
> ATA_PIO5
) ) {
792 KdPrint2((PRINT_PREFIX
793 "AtapiDmaReinit: FORCE_DOWNRATE on Device %d for LBA48\n", LunExt
->Lun
));
798 if(AtaReq
->Flags
& REQ_FLAG_FORCE_DOWNRATE
) {
799 KdPrint2((PRINT_PREFIX
800 "AtapiDmaReinit: FORCE_DOWNRATE on Device %d\n", LunExt
->Lun
));
801 if(AtaReq
->lba
>= (LONGLONG
)ATA_MAX_LBA28
) {
803 LunExt
->DeviceFlags
|= REQ_FLAG_FORCE_DOWNRATE_LBA48
;
805 // do not make extra work if we already use PIO
806 if(/*LunExt->TransferMode >= ATA_DMA*/
807 (LunExt
->TransferMode
> ATA_PIO5
) && (LunExt
->TransferMode
!= ATA_PIO0
+apiomode
)
809 KdPrint2((PRINT_PREFIX
810 "AtapiDmaReinit: set PIO mode on Device %d (%x -> %x)\n", LunExt
->Lun
, LunExt
->TransferMode
, ATA_PIO0
+apiomode
));
811 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
816 if(LunExt
->LimitedTransferMode
< LunExt
->TransferMode
) {
817 KdPrint2((PRINT_PREFIX
818 "AtapiDmaReinit: set PIO mode on Device %d (%x -> %x) (2)\n", LunExt
->Lun
, LunExt
->TransferMode
, LunExt
->LimitedTransferMode
));
819 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
820 LunExt
->LimitedTransferMode
-ATA_PIO0
,
826 KdPrint2((PRINT_PREFIX
827 "AtapiDmaReinit: set MAX mode on Device %d\n", LunExt
->Lun
));
828 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
830 min( retry_Wdma
[AtaReq
->retry
],
831 (CHAR
)AtaWmode(&(LunExt
->IdentifyData
)) ),
832 min( retry_Udma
[AtaReq
->retry
],
833 (CHAR
)AtaUmode(&(LunExt
->IdentifyData
)) ) );
835 // LunExt->DeviceFlags &= ~DFLAGS_FORCE_DOWNRATE;
837 if(/*!(LunExt->DeviceFlags & DFLAGS_FORCE_DOWNRATE) &&*/
838 (LunExt
->LimitedTransferMode
>
839 LunExt
->TransferMode
) ||
840 (LunExt
->DeviceFlags
& DFLAGS_REINIT_DMA
) ||
841 ((deviceExtension
->HwFlags
& UNIATA_CHAN_TIMINGS
) && ((ULONG
)LunExt
->Lun
!= LunExt
->chan
->last_cdev
))) {
843 KdPrint2((PRINT_PREFIX
844 "AtapiDmaReinit: restore IO mode on Device %d, last dev %d\n", LunExt
->Lun
, LunExt
->chan
->last_cdev
));
845 AtapiDmaInit__(deviceExtension
, LunExt
);
847 KdPrint2((PRINT_PREFIX
848 "AtapiDmaReinit: LimitedTransferMode == TransferMode = %x (%x), Device %d, last dev %d\n", LunExt
->TransferMode
, LunExt
->DeviceFlags
, LunExt
->Lun
, LunExt
->chan
->last_cdev
));
853 } // end AtapiDmaReinit()
858 IN PHW_DEVICE_EXTENSION deviceExtension
,
859 IN PHW_LU_EXTENSION LunExt
862 if(LunExt
->IdentifyData
.SupportDma
||
863 (LunExt
->IdentifyData
.AtapiDMA
.DMASupport
&& (LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
))) {
864 KdPrint2((PRINT_PREFIX
865 "AtapiDmaInit__: Set (U)DMA on Device %d\n", LunExt
->Lun
));
866 /* for(i=AtaUmode(&(LunExt->IdentifyData)); i>=0; i--) {
867 AtapiDmaInit(deviceExtension, ldev & 1, ldev >> 1,
868 (CHAR)AtaPioMode(&(LunExt->IdentifyData)),
869 (CHAR)AtaWmode(&(LunExt->IdentifyData)),
870 UDMA_MODE0+(CHAR)i );
872 for(i=AtaWmode(&(LunExt->IdentifyData)); i>=0; i--) {
873 AtapiDmaInit(deviceExtension, ldev & 1, ldev >> 1,
874 (CHAR)AtaPioMode(&(LunExt->IdentifyData)),
875 (CHAR)AtaWmode(&(LunExt->IdentifyData)),
876 UDMA_MODE0+(CHAR)i );
878 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
879 (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
)),
880 (CHAR
)AtaWmode(&(LunExt
->IdentifyData
)),
881 (CHAR
)AtaUmode(&(LunExt
->IdentifyData
)) );
883 KdPrint2((PRINT_PREFIX
884 "AtapiDmaInit__: Set PIO on Device %d\n", LunExt
->Lun
));
885 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
886 (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
)), -1, -1);
888 } // end AtapiDmaInit__()
893 IN PHW_DEVICE_EXTENSION deviceExtension
,
894 IN ULONG DeviceNumber
,
895 IN ULONG lChannel
, // logical channel,
896 IN PHW_LU_EXTENSION LunExt
,
900 KdPrint3((PRINT_PREFIX
901 "AtaSetTransferMode: Set %#x on Device %d/%d\n", mode
, lChannel
, DeviceNumber
));
904 BOOLEAN disable_intr
= (deviceExtension
->HwFlags
& UNIATA_AHCI
) || (CPU_num
>1);
906 if(deviceExtension->HwFlags & UNIATA_SATA) {
907 // experimental do nothing, see ROS BUG-9119, v0.46a1
908 statusByte = IDE_STATUS_IDLE;
910 if(LunExt
->DeviceFlags
& DFLAGS_MANUAL_CHS
) {
911 statusByte
= mode
<= ATA_PIO2
? IDE_STATUS_IDLE
: IDE_STATUS_ERROR
;
915 AtapiDisableInterrupts(deviceExtension
, lChannel
);
917 if(mode
> ATA_UDMA6
) {
918 // for SATA, it doesn't have option to set transfer rate
919 // We need this just to switch between PIO and DMA modes
920 // Devices may support only some lower transfer rates (e.g. UDMA0-4)
921 umode
= min((UCHAR
)AtaUmode(&(LunExt
->IdentifyData
)), 6);
926 statusByte
= AtaCommand(deviceExtension
, DeviceNumber
, lChannel
,
927 IDE_COMMAND_SET_FEATURES
, 0, 0, 0,
928 (UCHAR
)umode
, ATA_C_F_SETXFER
, ATA_WAIT_BASE_READY
);
930 AtapiEnableInterrupts(deviceExtension
, lChannel
);
933 if(statusByte
& IDE_STATUS_ERROR
) {
934 KdPrint3((PRINT_PREFIX
" wait ready after error\n"));
935 if(LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
) {
936 AtapiStallExecution(10);
938 AtapiStallExecution(100);
940 apiomode
= (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
));
941 if( (apiomode
> 0) &&
942 ((CHAR
)AtaWmode(&(LunExt
->IdentifyData
)) > 0) &&
943 ((CHAR
)AtaUmode(&(LunExt
->IdentifyData
)) > 0)
947 if(mode
> ATA_PIO2
) {
950 KdPrint3((PRINT_PREFIX
" assume that drive doesn't support mode swithing using PIO%d\n", apiomode
));
951 mode
= ATA_PIO0
+ apiomode
;
953 // SATA sets actual transfer rate in LunExt on init.
954 // There is no run-time SATA rate adjustment yet.
955 // On the other hand, we may turn SATA device in PIO mode
956 LunExt
->TransferMode
= (UCHAR
)mode
;
957 if(deviceExtension
->HwFlags
& UNIATA_SATA
) {
958 if(mode
< ATA_SA150
) {
959 LunExt
->PhyTransferMode
= max(LunExt
->PhyTransferMode
, LunExt
->TransferMode
);
961 LunExt
->PhyTransferMode
= LunExt
->TransferMode
;
964 if(LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
) {
965 LunExt
->PhyTransferMode
= max(LunExt
->LimitedTransferMode
, LunExt
->TransferMode
);
967 LunExt
->PhyTransferMode
= LunExt
->TransferMode
;
971 } // end AtaSetTransferMode()
976 IN PVOID HwDeviceExtension
,
977 IN ULONG DeviceNumber
,
978 IN ULONG lChannel
, // logical channel,
979 // is always 0 except simplex-only controllers
985 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
986 ULONG Channel
= deviceExtension
->Channel
+ lChannel
;
987 PHW_CHANNEL chan
= &deviceExtension
->chan
[lChannel
];
988 //LONG statusByte = 0;
989 ULONG dev
= Channel
*2 + DeviceNumber
; // for non-SATA/AHCI only!
990 //ULONG ldev = lChannel*2 + DeviceNumber; // for non-SATA/AHCI only!
991 BOOLEAN isAtapi
= ATAPI_DEVICE(chan
, DeviceNumber
);
992 ULONG slotNumber
= deviceExtension
->slotNumber
;
993 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
995 PHW_LU_EXTENSION LunExt
= chan
->lun
[DeviceNumber
];
998 ULONG VendorID
= deviceExtension
->DevID
& 0xffff;
999 //ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
1000 //ULONG RevID = deviceExtension->RevID;
1001 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
1002 ULONG ChipFlags
= deviceExtension
->HwFlags
& CHIPFLAG_MASK
;
1004 LONG statusByte
= 0;
1006 //UCHAR *reg_val = NULL;
1008 LunExt
->DeviceFlags
&= ~DFLAGS_REINIT_DMA
;
1009 /* set our most pessimistic default mode */
1010 LunExt
->TransferMode
= ATA_PIO
;
1011 // if(!deviceExtension->BaseIoAddressBM[lChannel]) {
1012 if(!deviceExtension
->BusMaster
) {
1013 KdPrint2((PRINT_PREFIX
" !deviceExtension->BusMaster: NO DMA\n"));
1014 wdmamode
= udmamode
= -1;
1017 // Limit transfer mode (controller limitation)
1018 if((LONG
)chan
->MaxTransferMode
>= ATA_UDMA
) {
1019 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: chan->MaxTransferMode >= ATA_UDMA\n"));
1020 udmamode
= min( udmamode
, (CHAR
)(chan
->MaxTransferMode
- ATA_UDMA
));
1022 if((LONG
)chan
->MaxTransferMode
>= ATA_WDMA
) {
1023 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: chan->MaxTransferMode >= ATA_WDMA\n"));
1025 wdmamode
= min( wdmamode
, (CHAR
)(chan
->MaxTransferMode
- ATA_WDMA
));
1027 if((LONG
)chan
->MaxTransferMode
>= ATA_PIO0
) {
1028 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: NO DMA\n"));
1029 wdmamode
= udmamode
= -1;
1030 apiomode
= min( apiomode
, (CHAR
)(chan
->MaxTransferMode
- ATA_PIO0
));
1032 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: PIO0\n"));
1033 wdmamode
= udmamode
= -1;
1036 // Limit transfer mode (device limitation)
1037 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: LunExt->LimitedTransferMode %#x\n", LunExt
->LimitedTransferMode
));
1038 if((LONG
)LunExt
->LimitedTransferMode
>= ATA_UDMA
) {
1039 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: LunExt->MaxTransferMode >= ATA_UDMA => %#x\n",
1040 min( udmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_UDMA
))
1042 udmamode
= min( udmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_UDMA
));
1044 if((LONG
)LunExt
->LimitedTransferMode
>= ATA_WDMA
) {
1045 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: LunExt->MaxTransferMode >= ATA_WDMA => %#x\n",
1046 min( wdmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_WDMA
))
1049 wdmamode
= min( wdmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_WDMA
));
1051 if((LONG
)LunExt
->LimitedTransferMode
>= ATA_PIO0
) {
1052 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: lun NO DMA\n"));
1053 wdmamode
= udmamode
= -1;
1054 apiomode
= min( apiomode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_PIO0
));
1056 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: lun PIO0\n"));
1057 wdmamode
= udmamode
= -1;
1061 //if(!(ChipFlags & UNIATA_AHCI)) {
1063 // this is necessary for future PM support
1064 SelectDrive(chan
, DeviceNumber
);
1065 GetStatus(chan
, statusByte
);
1066 // we can see here IDE_STATUS_ERROR status after previous operation
1067 if(statusByte
& IDE_STATUS_ERROR
) {
1068 KdPrint2((PRINT_PREFIX
"IDE_STATUS_ERROR detected on entry, statusByte = %#x\n", statusByte
));
1069 //GetBaseStatus(chan, statusByte);
1071 if(statusByte
&& UniataIsIdle(deviceExtension
, statusByte
& ~IDE_STATUS_ERROR
) != IDE_STATUS_IDLE
) {
1072 KdPrint2((PRINT_PREFIX
"Can't setup transfer mode: statusByte = %#x\n", statusByte
));
1077 chan
->last_cdev
= DeviceNumber
;
1078 if(UniataIsSATARangeAvailable(deviceExtension
, lChannel
) ||
1079 (ChipFlags
& UNIATA_AHCI
) || (chan
->MaxTransferMode
>= ATA_SA150
)
1081 //if(ChipFlags & (UNIATA_SATA | UNIATA_AHCI)) {
1086 KdPrint2((PRINT_PREFIX
"SATA Generic\n"));
1088 if((udmamode
>= 5) || (ChipFlags
& UNIATA_AHCI
) || ((udmamode
>= 0) && (chan
->MaxTransferMode
>= ATA_SA150
))) {
1089 /* some drives report UDMA6, some UDMA5 */
1090 /* ATAPI may not have SataCapabilities set in IDENTIFY DATA */
1091 if(ata_is_sata(&(LunExt
->IdentifyData
))) {
1092 //udmamode = min(udmamode, 6);
1093 KdPrint2((PRINT_PREFIX
"LunExt->LimitedTransferMode %x, LunExt->OrigTransferMode %x\n",
1094 LunExt
->LimitedTransferMode
, LunExt
->OrigTransferMode
));
1095 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, min(LunExt
->LimitedTransferMode
, LunExt
->OrigTransferMode
))) {
1098 udmamode
= min(udmamode
, 6);
1101 KdPrint2((PRINT_PREFIX
"SATA -> PATA adapter ?\n"));
1102 if (udmamode
> 2 && (!LunExt
->IdentifyData
.HwResCableId
&& (LunExt
->IdentifyData
.HwResValid
== IDENTIFY_CABLE_ID_VALID
) )) {
1103 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: DMA limited to UDMA33, non-ATA66 compliant cable\n"));
1105 apiomode
= min( apiomode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_PIO0
));
1107 udmamode
= min(udmamode
, 6);
1112 ModeByte
= ATA_UDMA0
+ udmamode
;
1115 ModeByte
= ATA_WDMA0
+ wdmamode
;
1118 ModeByte
= ATA_PIO0
+ apiomode
;
1123 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ModeByte
);
1127 if(deviceExtension
->UnknownDev
) {
1128 KdPrint2((PRINT_PREFIX
"Unknown chip, omit Vendor/Dev checks\n"));
1129 goto try_generic_dma
;
1132 if(udmamode
> 2 && (!LunExt
->IdentifyData
.HwResCableId
&& (LunExt
->IdentifyData
.HwResValid
== IDENTIFY_CABLE_ID_VALID
)) ) {
1133 if(ata_is_sata(&(LunExt
->IdentifyData
))) {
1134 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: SATA beyond adapter or Controller compat mode\n"));
1136 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: DMA limited to UDMA33, non-ATA66 compliant cable\n"));
1138 apiomode
= min( apiomode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_PIO
));
1142 KdPrint2((PRINT_PREFIX
"Setup chip a:w:u=%d:%d:%d\n",
1148 case ATA_ACARD_ID
: {
1152 static const USHORT reg4a
= 0xa6;
1153 UCHAR reg
= 0x40 + (UCHAR
)dev
;
1155 if(ChipType
== ATPOLD
) {
1157 static const USHORT reg4x2
= 0x0301;
1159 for(i
=udmamode
; i
>=0; i
--) {
1160 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA
+ i
)) {
1162 ChangePciConfig1(0x54, a
| (0x01 << dev
) | ((i
+1) << (dev
*2)));
1163 SetPciConfig1(0x4a, reg4a
);
1164 SetPciConfig2(reg
, reg4x2
);
1169 if (wdmamode
>= 2 && apiomode
>= 4) {
1170 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1176 static const UCHAR reg4x
= 0x31;
1178 for(i
=udmamode
; i
>=0; i
--) {
1179 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA
+ i
)) {
1181 ChangePciConfig2(0x44, (a
& ~(0x000f << (dev
* 4))) | ((i
+1) << (dev
*4)));
1182 SetPciConfig1(0x4a, reg4a
);
1183 SetPciConfig1(reg
, reg4x
);
1188 if (wdmamode
>= 2 && apiomode
>= 4) {
1189 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1194 /* Use GENERIC PIO */
1196 case ATA_ACER_LABS_ID
: {
1197 /************************/
1198 /* Acer Labs Inc. (ALI) */
1199 /************************/
1200 static const UCHAR ali_udma
[] = {0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f};
1201 static const ULONG ali_pio
[] =
1202 { 0x006d0003, 0x00580002, 0x00440001, 0x00330001,
1203 0x00310001, 0x00440001};
1204 /* the older Aladdin doesn't support ATAPI DMA on both master & slave */
1205 if ((ChipFlags
& ALIOLD
) &&
1206 (udmamode
>= 0 || wdmamode
>= 0)) {
1207 if(ATAPI_DEVICE(chan
, 0) &&
1208 ATAPI_DEVICE(chan
, 1)) {
1209 // 2 devices on this channel - NO DMA
1210 chan
->MaxTransferMode
=
1211 min(chan
->MaxTransferMode
, ATA_PIO4
);
1212 udmamode
= wdmamode
= -1;
1216 for(i
=udmamode
; i
>=0; i
--) {
1217 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1220 GetPciConfig4(0x54, word54
);
1221 word54
&= ~(0x000f000f << (dev
* 4));
1222 word54
|= (((ali_udma
[i
]<<16) | 5) << (dev
* 4));
1223 SetPciConfig4(0x54, word54
);
1224 ChangePciConfig1(0x53, a
| 0x03);
1225 SetPciConfig4(0x58 + (Channel
<<2), 0x00310001);
1229 /* make sure eventual UDMA mode from the BIOS is disabled */
1230 ChangePciConfig2(0x56, a
& ~(0x0008 << (dev
* 4)) );
1231 if (wdmamode
>= 2 && apiomode
>= 4) {
1232 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1233 ChangePciConfig1(0x53, a
| 0x03);
1234 chan
->ChannelCtrlFlags
|= CTRFLAGS_DMA_RO
;
1238 ChangePciConfig1(0x53, (a
& ~0x01) | 0x02);
1240 for(i
=apiomode
; i
>=0; i
--) {
1241 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ i
)) {
1242 ChangePciConfig4(0x54, a
& ~(0x0008000f << (dev
* 4)));
1243 SetPciConfig4(0x58 + (Channel
<<2), ali_pio
[i
]);
1252 /********************/
1253 /* AMD, nVidia, VIA */
1254 /********************/
1255 if(VendorID
== ATA_VIA_ID
) {
1256 if((ChipFlags
& VIASATA
) &&
1258 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_SA150
);
1261 if((ChipFlags
& VIABAR
) &&
1263 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_SA150
);
1268 static const UCHAR via_modes
[6][7] = {
1269 { 0xc2, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00 }, /* ATA33 and New Chips */
1270 { 0xee, 0xec, 0xea, 0xe9, 0xe8, 0x00, 0x00 }, /* ATA66 */
1271 { 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0x00 }, /* ATA100 */
1272 { 0xf7, 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0 }, /* VIA ATA133 */
1273 { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }, /* AMD/nVIDIA */
1274 { 0xee, 0xe8, 0xe6, 0xe4, 0xe2, 0xe1, 0xe0 }}; /* VIA new */
1275 static const UCHAR via_pio
[] =
1276 { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20,
1277 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
1278 const UCHAR
*reg_val
= NULL
;
1279 UCHAR reg
= 0x53-(UCHAR
)dev
;
1280 UCHAR reg2
= reg
-0x08;
1282 if(ChipFlags
& VIABAR
) {
1287 reg_val
= &via_modes
[ChipType
][0];
1289 if(VendorID
== ATA_NVIDIA_ID
) {
1294 for(i
= udmamode
; i
>=0; i
--) {
1295 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1296 SetPciConfig1(reg2
, via_pio
[8+i
]);
1297 SetPciConfig1(reg
, (UCHAR
)reg_val
[i
]);
1301 if(!(ChipFlags
& VIABAR
)) {
1302 /* This chip can't do WDMA. */
1303 for(i
= wdmamode
; i
>=0; i
--) {
1304 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1305 SetPciConfig1(reg2
, via_pio
[5+i
]);
1306 SetPciConfig1(reg
, 0x8b);
1311 /* set PIO mode timings */
1312 if((apiomode
>= 0) && (ChipType
!= VIA133
)) {
1313 SetPciConfig1(reg2
, via_pio
[apiomode
]);
1315 if(VendorID
== ATA_VIA_ID
/*&& (ChipType == VIA33 || ChipType == VIA66)*/) {
1316 via82c_timing(deviceExtension
, dev
, ATA_PIO0
+ apiomode
);
1318 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1322 case ATA_CYRIX_ID
: {
1330 if(ChipType
== CYRIX_3x
) {
1331 ULONG cyr_piotiming
[] =
1332 { 0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010 };
1333 ULONG cyr_wdmatiming
[] = { 0x00077771, 0x00012121, 0x00002020 };
1334 ULONG cyr_udmatiming
[] = { 0x00921250, 0x00911140, 0x00911030 };
1335 ULONG mode_reg
= 0x24+(dev
<< 3);
1337 for(i
=udmamode
; i
>=0; i
--) {
1338 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1339 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
), mode_reg
, cyr_udmatiming
[udmamode
]);
1343 for(i
=wdmamode
; i
>=0; i
--) {
1344 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1345 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
), mode_reg
, cyr_wdmatiming
[wdmamode
]);
1349 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1350 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
), mode_reg
, cyr_piotiming
[apiomode
]);
1354 if(ChipType
== CYRIX_OLD
) {
1355 UCHAR cyr_piotiming_old
[] =
1359 for(i
=wdmamode
; i
>=0; i
--) {
1360 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1364 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1365 timing
= (6-apiomode
) | (cyr_piotiming_old
[i
]);
1366 /* Channel command timing */
1367 SetPciConfig1(0x62+Channel
, timing
);
1368 /* Read command timing */
1369 SetPciConfig1(0x64+Channel
*4+dev
, timing
);
1370 /* Write command timing */
1371 SetPciConfig1(0x66+Channel
*4+dev
, timing
);
1375 if(ChipType
== CYRIX_35
) {
1377 USHORT c35_pio_timings[5] = {
1378 0xF7F4, 0xF173, 0x8141, 0x5131, 0x1131
1380 USHORT c35_pio_cmd_timings[5] = {
1381 0xF7F4, 0x53F3, 0x13F1, 0x5131, 0x1131
1383 ULONG c35_udma_timings[5] = {
1384 0x7F7436A1, 0x7F733481, 0x7F723261, 0x7F713161, 0x7F703061
1386 ULONG c35_mwdma_timings[3] = {
1387 0x7F0FFFF3, 0x7F035352, 0x7F024241
1389 ULONG mode_reg = 0x24+(dev << 3);
1391 /* No MSR support yet, do not touch any regs */
1392 for(i
=udmamode
; i
>=0; i
--) {
1393 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1397 for(i
=wdmamode
; i
>=0; i
--) {
1398 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1402 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1409 case ATA_NATIONAL_ID
: {
1414 ULONG nat_piotiming
[] =
1415 { 0x9172d132, 0x21717121, 0x00803020, 0x20102010, 0x00100010,
1416 0x00803020, 0x20102010, 0x00100010,
1417 0x00100010, 0x00100010, 0x00100010 };
1418 ULONG nat_dmatiming
[] = { 0x80077771, 0x80012121, 0x80002020 };
1419 ULONG nat_udmatiming
[] = { 0x80921250, 0x80911140, 0x80911030 };
1423 for(i
=udmamode
; i
>=0; i
--) {
1424 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1425 SetPciConfig4(0x44 + (dev
* 8), nat_udmatiming
[i
]);
1426 SetPciConfig4(0x40 + (dev
* 8), nat_piotiming
[i
+8]);
1430 for(i
=wdmamode
; i
>=0; i
--) {
1431 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1432 SetPciConfig4(0x44 + (dev
* 8), nat_dmatiming
[i
]);
1433 SetPciConfig4(0x40 + (dev
* 8), nat_piotiming
[i
+5]);
1437 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1438 ChangePciConfig4(0x44 + (dev
* 8), a
| 0x80000000);
1439 SetPciConfig4(0x40 + (dev
* 8), nat_piotiming
[apiomode
]);
1445 /* Use GENERIC PIO */
1447 case ATA_CYPRESS_ID
:
1451 if (wdmamode
>= 2 && apiomode
>= 4) {
1452 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1453 SetPciConfig2(Channel
? 0x4e:0x4c, 0x2020);
1457 /* Use GENERIC PIO */
1459 case ATA_MARVELL_ID
:
1463 for(i
=udmamode
; i
>=0; i
--) {
1464 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1468 for(i
=wdmamode
; i
>=0; i
--) {
1469 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1473 /* try generic DMA, use hpt_timing() */
1474 if (wdmamode
>= 0 && apiomode
>= 4) {
1475 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
)) {
1479 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1482 case ATA_NETCELL_ID
:
1486 if (wdmamode
>= 2 && apiomode
>= 4) {
1487 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1491 /* Use GENERIC PIO */
1493 case ATA_HIGHPOINT_ID
: {
1494 /********************/
1495 /* High Point (HPT) */
1496 /********************/
1497 for(i
=udmamode
; i
>=0; i
--) {
1498 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1499 hpt_timing(deviceExtension
, dev
, (UCHAR
)(ATA_UDMA
+ i
)); // ???
1504 for(i
=wdmamode
; i
>=0; i
--) {
1505 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1506 hpt_timing(deviceExtension
, dev
, (UCHAR
)(ATA_WDMA0
+i
));
1510 /* try generic DMA, use hpt_timing() */
1511 if (wdmamode
>= 0 && apiomode
>= 4) {
1512 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
)) {
1516 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1517 hpt_timing(deviceExtension
, dev
, ATA_PIO0
+ apiomode
);
1520 case ATA_INTEL_ID
: {
1525 KdPrint2((PRINT_PREFIX
"Intel %d\n", Channel
));
1526 BOOLEAN udma_ok
= FALSE
;
1537 UCHAR intel_timings
[] = { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23,
1538 0x23, 0x23, 0x23, 0x23, 0x23, 0x23 };
1539 UCHAR intel_utimings
[] = { 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02 };
1540 const UCHAR needed_pio
[3] = {
1541 ATA_PIO0
, ATA_PIO3
, ATA_PIO4
1544 if(deviceExtension
->DevID
== ATA_I82371FB
) {
1545 KdPrint2((PRINT_PREFIX
" I82371FB\n"));
1548 for(i
=wdmamode
; i
>=0; i
--) {
1550 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1556 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1559 /* If the drive MWDMA is faster than it can do PIO then
1560 we must force PIO into PIO0 */
1561 if (apiomode
< needed_pio
[wdmamode
]) {
1562 /* Enable DMA timing only */
1563 control
|= 8; /* PIO cycles in PIO0 */
1566 GetPciConfig2(0x40+Channel
*2, reg4x
);
1567 if(apiomode
> ATA_PIO0
) {
1568 control
|= 0x03; /* IORDY|TIME0 */
1570 control
|= 0x02; /* IORDY */
1572 // if (ata_pio_need_iordy(adev))
1573 //control |= 2; /* IE */
1575 control
|= 4; /* PPE enable */
1577 /* Mask out the relevant control and timing bits we will load. Also
1578 clear the other drive TIME register as a precaution */
1579 reg4x
&= 0xCC00 | (0x0E << (DeviceNumber
*4));
1580 reg4x
|= control
<< (DeviceNumber
*4);
1581 reg4x
|= intel_timings
[idx
] << 8;
1582 SetPciConfig2(0x40+Channel
*2, reg4x
);
1586 if(deviceExtension
->DevID
== ATA_ISCH
) {
1588 KdPrint2((PRINT_PREFIX
" ISCH\n"));
1589 GetPciConfig4(0x80 + dev
*4, tim
);
1591 for(i
=udmamode
; i
>=0; i
--) {
1592 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1594 tim
&= ~(0x7 << 16);
1599 apiomode
= ATA_PIO4
;
1604 for(i
=wdmamode
; i
>=0; i
--) {
1605 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1606 tim
&= ~(0x1 << 31);
1612 apiomode
= (i
== 0) ? ATA_PIO0
:
1613 (i
== 1) ? ATA_PIO3
: ATA_PIO4
;
1619 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1623 tim
|= (apiomode
& 0x7);
1624 SetPciConfig4(0x80 + dev
*4, tim
);
1629 GetPciConfig2(0x48, reg48
);
1630 // if(!(ChipFlags & ICH4_FIX)) {
1631 GetPciConfig2(0x4a, reg4a
);
1633 GetPciConfig2(0x54, reg54
);
1634 // if(udmamode >= 0) {
1635 // enable the write buffer to be used in a split (ping/pong) manner.
1641 // reg40 &= ~0x00ff00ff;
1642 // reg40 |= 0x40774077;
1644 for(i
=udmamode
; i
>=0; i
--) {
1645 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1647 /* Set UDMA reference clock (33 MHz or more). */
1648 SetPciConfig1(0x48, reg48
| (0x0001 << dev
));
1649 // if(!(ChipFlags & ICH4_FIX)) {
1650 if(deviceExtension
->MaxTransferMode
== ATA_UDMA3
) {
1651 // Special case (undocumented overclock !) for PIIX4e
1652 SetPciConfig2(0x4a, (reg4a
| (0x03 << (dev
<<2)) ) );
1654 SetPciConfig2(0x4a, (reg4a
& ~(0x03 << (dev
<<2))) |
1655 (((USHORT
)(intel_utimings
[i
])) << (dev
<<2) ) );
1658 /* Set UDMA reference clock (66 MHz or more). */
1659 reg54
&= ~(0x1001 << dev
);
1661 reg54
|= (0x1 << dev
);
1663 /* Set UDMA reference clock (133 MHz). */
1665 reg54
|= (0x1000 << dev
);
1667 SetPciConfig2(0x54, reg54
);
1671 if(ChipFlags
& ICH4_FIX
) {
1672 KdPrint2((PRINT_PREFIX
" ICH4_FIX udma\n"));
1680 SetPciConfig1(0x48, reg48
& ~(0x0001 << dev
));
1681 if(!(ChipFlags
& ICH4_FIX
)) {
1682 SetPciConfig2(0x4a, (reg4a
& ~(0x3 << (dev
<< 2))) );
1684 SetPciConfig2(0x54, reg54
& ~(0x1001 << dev
));
1685 for(i
=wdmamode
; i
>=0; i
--) {
1686 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1689 if(ChipFlags
& ICH4_FIX
) {
1690 KdPrint2((PRINT_PREFIX
" ICH4_FIX wdma\n"));
1699 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1703 GetPciConfig4(0x40, reg40
);
1704 GetPciConfig1(0x44, reg44
);
1706 /* Allow PIO/WDMA timing controls. */
1707 reg40
&= ~0x00ff00ff;
1708 reg40
|= 0x40774077;
1710 mask40
= 0x000000ff;
1711 /* Set PIO/WDMA timings. */
1712 if(!(DeviceNumber
& 1)) {
1713 mask40
= 0x00003300;
1714 new40
= ((USHORT
)(intel_timings
[idx
]) << 8);
1717 new44
= ((intel_timings
[idx
] & 0x30) >> 2) |
1718 (intel_timings
[idx
] & 0x03);
1728 KdPrint2((PRINT_PREFIX
" 0x40 %x/%x, 0x44 %x/%x\n", mask40
, new40
, mask44
, new44
));
1729 SetPciConfig4(0x40, (reg40
& ~mask40
) | new40
);
1730 SetPciConfig1(0x44, (reg44
& ~mask44
) | new44
);
1734 case ATA_PROMISE_ID
: {
1739 UCHAR sel66
= Channel
? 0x08: 0x02;
1741 if(ChipType
< PRTX
) {
1747 for(i
=udmamode
; i
>=0; i
--) {
1749 if(ChipType
== PRNEW
) {
1751 AtapiWritePortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11,
1752 AtapiReadPortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11) |
1755 AtapiWritePortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11,
1756 AtapiReadPortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11) &
1761 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1762 promise_timing(deviceExtension
, dev
, (UCHAR
)(ATA_UDMA
+ i
)); // ???
1766 if(ChipType
== PRNEW
) {
1767 AtapiWritePortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11,
1768 AtapiReadPortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11) &
1771 for(i
=wdmamode
; i
>=0; i
--) {
1772 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1773 promise_timing(deviceExtension
, dev
, (UCHAR
)(ATA_WDMA0
+i
));
1777 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1778 promise_timing(deviceExtension
, dev
, ATA_PIO0
+ apiomode
);
1783 KdPrint2((PRINT_PREFIX
"ATI\n"));
1784 if(ChipType
== SIIMIO
) {
1785 goto l_ATA_SILICON_IMAGE_ID
;
1787 //goto ATA_SERVERWORKS_ID;
1792 case ATA_SERVERWORKS_ID
: {
1796 // static const ULONG udma_modes[] = { 0x70, 0x21, 0x20 };
1797 static const ULONG sw_dma_modes
[] = { 0x70, 0x21, 0x20 };
1798 static const ULONG sw_pio_modes
[] = { 0x5d, 0x47, 0x34, 0x22, 0x20, 0x34, 0x22, 0x20,
1799 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
1803 ULONG offset
= dev
^ 0x01;
1804 ULONG bit_offset
= offset
* 8;
1806 for(i
=udmamode
; i
>=0; i
--) {
1807 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1808 GetPciConfig2(0x56, reg56
);
1809 reg56
&= ~(0xf << (dev
* 4));
1810 reg56
|= ((USHORT
)i
<< (dev
* 4));
1811 SetPciConfig2(0x56, reg56
);
1812 ChangePciConfig1(0x54, a
| (0x01 << dev
));
1814 GetPciConfig4(0x44, reg44
);
1815 reg44
= (reg44
& ~(0xff << bit_offset
)) |
1816 (sw_dma_modes
[2] << bit_offset
);
1817 SetPciConfig4(0x44, reg44
);
1819 GetPciConfig4(0x40, reg40
);
1820 reg40
= (reg40
& ~(0xff << bit_offset
)) |
1821 (sw_pio_modes
[8+i
] << bit_offset
);
1822 SetPciConfig4(0x40, reg40
);
1827 for(i
=wdmamode
; i
>=0; i
--) {
1828 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1830 ChangePciConfig1(0x54, a
& ~(0x01 << dev
));
1832 GetPciConfig4(0x44, reg44
);
1833 reg44
= (reg44
& ~(0xff << bit_offset
)) |
1834 (sw_dma_modes
[wdmamode
] << bit_offset
);
1835 SetPciConfig4(0x44, reg44
);
1837 GetPciConfig4(0x40, reg40
);
1838 reg40
= (reg40
& ~(0xff << bit_offset
)) |
1839 (sw_pio_modes
[5+i
] << bit_offset
);
1840 SetPciConfig4(0x40, reg40
);
1844 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1845 // SetPciConfig4(0x44, sw_pio_modes[apiomode]);
1846 if(VendorID
== ATA_ATI_ID
) {
1847 // special case for ATI
1848 // Seems, that PATA ATI are just re-brended ServerWorks
1851 GetPciConfig2(0x4a, reg4a
);
1852 reg4a
= (reg4a
& ~(0xf << (dev
*4))) |
1853 (apiomode
<< (dev
*4));
1854 SetPciConfig2(0x4a, reg4a
);
1858 GetPciConfig4(0x40, reg40
);
1859 reg40
= (reg40
& ~(0xff << bit_offset
)) |
1860 (sw_pio_modes
[apiomode
] << bit_offset
);
1861 SetPciConfig4(0x40, reg40
);
1864 case ATA_SILICON_IMAGE_ID
: {
1865 l_ATA_SILICON_IMAGE_ID
:
1866 /********************/
1867 /* SiliconImage/CMD */
1868 /********************/
1869 if(ChipType
== SIIMIO
) {
1871 static const UCHAR sil_modes
[7] =
1872 { 0xf, 0xb, 0x7, 0x5, 0x3, 0x2, 0x1 };
1873 static const USHORT sil_wdma_modes
[3] =
1874 { 0x2208, 0x10c2, 0x10c1 };
1875 static const USHORT sil_pio_modes
[6] =
1876 { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1, 0x10c1 };
1878 UCHAR ureg
= 0xac + ((UCHAR
)DeviceNumber
* 0x02) + ((UCHAR
)Channel
* 0x10);
1880 UCHAR mreg
= Channel
? 0x84 : 0x80;
1881 UCHAR mask
= DeviceNumber
? 0x30 : 0x03;
1884 GetPciConfig1(ureg
, uval
);
1885 GetPciConfig1(mreg
, mode
);
1887 /* enable UDMA mode */
1888 for(i
= udmamode
; i
>=0; i
--) {
1890 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1891 SetPciConfig1(mreg
, mode
| mask
);
1892 SetPciConfig1(ureg
, (uval
& 0x3f) | sil_modes
[i
]);
1896 /* enable WDMA mode */
1897 for(i
= wdmamode
; i
>=0; i
--) {
1899 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1900 SetPciConfig1(mreg
, mode
| (mask
& 0x22));
1901 SetPciConfig2(ureg
- 0x4, sil_wdma_modes
[i
]);
1905 /* restore PIO mode */
1906 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1908 SetPciConfig1(mreg
, mode
| (mask
& 0x11));
1909 SetPciConfig2(ureg
- 0x8, sil_pio_modes
[apiomode
]);
1914 static const UCHAR cmd_modes
[2][6] = {
1915 { 0x31, 0x21, 0x011, 0x25, 0x15, 0x05 },
1916 { 0xc2, 0x82, 0x042, 0x8a, 0x4a, 0x0a } };
1917 static const UCHAR cmd_wdma_modes
[] = { 0x87, 0x32, 0x3f };
1918 static const UCHAR cmd_pio_modes
[] = { 0xa9, 0x57, 0x44, 0x32, 0x3f };
1919 ULONG treg
= 0x54 + ((dev
< 3) ? (dev
<< 1) : 7);
1921 udmamode
= min(udmamode
, 5);
1922 /* enable UDMA mode */
1923 for(i
= udmamode
; i
>=0; i
--) {
1926 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1927 GetPciConfig1(Channel
? 0x7b : 0x73, umode
);
1928 umode
&= ~(!(DeviceNumber
& 1) ? 0x35 : 0xca);
1929 umode
|= ( cmd_modes
[DeviceNumber
& 1][i
]);
1930 SetPciConfig1(Channel
? 0x7b : 0x73, umode
);
1934 /* make sure eventual UDMA mode from the BIOS is disabled */
1935 ChangePciConfig1(Channel
? 0x7b : 0x73, a
& ~(!(DeviceNumber
& 1) ? 0x35 : 0xca));
1937 for(i
= wdmamode
; i
>=0; i
--) {
1939 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1940 SetPciConfig1(treg
, cmd_wdma_modes
[i
]);
1941 ChangePciConfig1(Channel
? 0x7b : 0x73, a
& ~(!(DeviceNumber
& 1) ? 0x35 : 0xca));
1945 /* set PIO mode timings */
1946 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1948 SetPciConfig1(treg
, cmd_pio_modes
[apiomode
]);
1949 ChangePciConfig1(Channel
? 0x7b : 0x73, a
& ~(!(DeviceNumber
& 1) ? 0x35 : 0xca));
1959 PULONG sis_modes
= NULL
;
1960 static const ULONG sis_modes_new133
[] =
1961 { 0x28269008, 0x0c266008, 0x04263008, 0x0c0a3008, 0x05093008,
1962 0x22196008, 0x0c0a3008, 0x05093008, 0x050939fc, 0x050936ac,
1963 0x0509347c, 0x0509325c, 0x0509323c, 0x0509322c, 0x0509321c};
1964 static const ULONG sis_modes_old133
[] =
1965 { 0x00cb, 0x0067, 0x0044, 0x0033, 0x0031, 0x0044, 0x0033, 0x0031,
1966 0x8f31, 0x8a31, 0x8731, 0x8531, 0x8331, 0x8231, 0x8131 };
1967 static const ULONG sis_modes_old
[] =
1968 { 0x0c0b, 0x0607, 0x0404, 0x0303, 0x0301, 0x0404, 0x0303, 0x0301,
1969 0xf301, 0xd301, 0xb301, 0xa301, 0x9301, 0x8301 };
1970 static const ULONG sis_modes_new100
[] =
1971 { 0x00cb, 0x0067, 0x0044, 0x0033, 0x0031, 0x0044, 0x0033, 0x0031,
1972 0x8b31, 0x8731, 0x8531, 0x8431, 0x8231, 0x8131 };
1981 sis_modes
= (PULONG
)(&sis_modes_new133
[0]);
1983 GetPciConfig1(0x57, reg57
);
1984 reg
= (reg57
& 0x40 ? 0x70 : 0x40) + (dev
* 4);
1987 sis_modes
= (PULONG
)(&sis_modes_old133
[0]);
1989 reg
= 0x40 + (dev
* 2);
1992 sis_modes
= (PULONG
)(&sis_modes_new100
[0]);
1994 reg
= 0x40 + (dev
* 2);
1999 sis_modes
= (PULONG
)(&sis_modes_old
[0]);
2001 reg
= 0x40 + (dev
* 2);
2006 for(i
=udmamode
; i
>=0; i
--) {
2007 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2009 SetPciConfig4(reg
, sis_modes
[offs
+i
]);
2011 SetPciConfig2(reg
, (USHORT
)sis_modes
[offs
+i
]);
2018 for(i
=wdmamode
; i
>=0; i
--) {
2019 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2021 SetPciConfig4(reg
, sis_modes
[offs
+i
]);
2023 SetPciConfig2(reg
, (USHORT
)sis_modes
[offs
+i
]);
2028 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2030 SetPciConfig4(reg
, sis_modes
[apiomode
]);
2032 SetPciConfig2(reg
, (USHORT
)sis_modes
[apiomode
]);
2037 /* Cenatek Rocket Drive controller */
2038 if (wdmamode
>= 0 &&
2039 (AtapiReadPort1(chan
, IDX_BM_Status
) &
2040 (DeviceNumber
? BM_STATUS_DRIVE_1_DMA
: BM_STATUS_DRIVE_0_DMA
))) {
2041 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ wdmamode
);
2043 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2046 case ATA_ITE_ID
: { /* ITE IDE controller */
2048 if(ChipType
== ITE_33
) {
2049 int a_speed
= 3 << (dev
* 4);
2050 int u_flag
= 1 << dev
;
2054 USHORT drive_enables
;
2057 GetPciConfig1(0x48, reg48
);
2058 GetPciConfig1(0x4a, reg4a
);
2061 * Setting the DMA cycle time to 2 or 3 PCI clocks (60 and 91 nsec
2062 * at 33 MHz PCI clock) seems to cause BadCRC errors during DMA
2063 * transfers on some drives, even though both numbers meet the minimum
2064 * ATAPI-4 spec of 73 and 54 nsec for UDMA 1 and 2 respectively.
2065 * So the faster times are just commented out here. The good news is
2066 * that the slower cycle time has very little affect on transfer
2070 for(i
=udmamode
; i
>=0; i
--) {
2071 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2072 SetPciConfig1(0x48, reg48
| u_flag
);
2074 SetPciConfig1(0x4a, reg4a
| u_speed
);
2076 goto setup_drive_ite
;
2080 for(i
=wdmamode
; i
>=0; i
--) {
2081 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2082 SetPciConfig1(0x48, reg48
& ~u_flag
);
2083 SetPciConfig1(0x4a, reg4a
& ~a_speed
);
2088 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2089 SetPciConfig1(0x48, reg48
& ~u_flag
);
2090 SetPciConfig1(0x4a, reg4a
& ~a_speed
);
2096 GetPciConfig2(0x40, drive_enables
);
2097 GetPciConfig4(0x44, drive_timing
);
2100 * FIX! The DIOR/DIOW pulse width and recovery times in port 0x44
2101 * are being left at the default values of 8 PCI clocks (242 nsec
2102 * for a 33 MHz clock). These can be safely shortened at higher
2103 * PIO modes. The DIOR/DIOW pulse width and recovery times only
2104 * apply to PIO modes, not to the DMA modes.
2108 * Enable port 0x44. The IT8172G spec is confused; it calls
2109 * this register the "Slave IDE Timing Register", but in fact,
2110 * it controls timing for both master and slave drives.
2112 drive_enables
|= 0x4000;
2114 drive_enables
&= (0xc000 | (0x06 << (DeviceNumber
*4)));
2116 /* enable prefetch and IORDY sample-point */
2117 drive_enables
|= (0x06 << (DeviceNumber
*4));
2120 SetPciConfig2(0x40, drive_enables
);
2122 if(ChipType
== ITE_133
) {
2123 static const UCHAR udmatiming
[] =
2124 { 0x44, 0x42, 0x31, 0x21, 0x11, 0xa2, 0x91 };
2125 static const UCHAR chtiming
[] =
2126 { 0xaa, 0xa3, 0xa1, 0x33, 0x31, 0x88, 0x32, 0x31 };
2127 ULONG offset
= (Channel
<<2) + DeviceNumber
;
2130 for(i
=udmamode
; i
>=0; i
--) {
2131 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2132 ChangePciConfig1(0x50, a
& ~(1 << (dev
+ 3)) );
2133 SetPciConfig1(0x56 + offset
, udmatiming
[i
]);
2138 for(i
=wdmamode
; i
>=0; i
--) {
2139 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2141 ChangePciConfig1(0x50, a
| (1 << (dev
+ 3)) );
2142 GetPciConfig1(0x54 + offset
, reg54
);
2143 if(reg54
< chtiming
[i
+5]) {
2144 SetPciConfig1(0x54 + offset
, chtiming
[i
+5]);
2149 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2150 ChangePciConfig1(0x50, a
| (1 << (dev
+ 3)) );
2151 GetPciConfig1(0x54 + offset
, reg54
);
2152 if(reg54
< chtiming
[apiomode
]) {
2153 SetPciConfig1(0x54 + offset
, chtiming
[apiomode
]);
2157 if(ChipType
== ITE_133_NEW
) {
2158 //static const USHORT reg54_timings[] = { 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x1001, 0x1001 };
2159 static const UCHAR udmatiming
[] =
2160 { 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10 };
2161 static const UCHAR timings
[] =
2162 { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23,
2163 0x23, 0x23, 0x23, 0x23, 0x23, 0x02, 0x02 };
2164 BOOLEAN udma_ok
= FALSE
;
2172 USHORT mask40
=0, new40
=0;
2173 UCHAR mask44
=0, new44
=0;
2175 GetPciConfig2(0x40, reg40
);
2176 GetPciConfig1(0x44, reg44
);
2177 GetPciConfig2(0x4a, reg4a
);
2178 GetPciConfig2(0x54, reg54
);
2180 if(!(reg54
& (0x10 << dev
))) {
2182 udmamode
= min(udmamode
, 2);
2185 for(i
=udmamode
; i
>=0; i
--) {
2186 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2187 ChangePciConfig1(0x48, a
| (1 << dev
) );
2188 ChangePciConfig2(0x4a,
2189 (a
& ~(0x3 << (dev
*4))) |
2190 (udmatiming
[i
] << (dev
*4)) );
2193 timing
= timings
[i
+8];
2198 for(i
=wdmamode
; !ok
&& i
>=0; i
--) {
2199 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2202 timing
= timings
[i
+5];
2208 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2209 timing
= timings
[apiomode
];
2213 ChangePciConfig1(0x48, a
& ~(1 << dev
) );
2214 ChangePciConfig2(0x4a, a
& ~(0x3 << (dev
<< 2)) );
2216 if (udma_ok
&& udmamode
>= ATA_UDMA2
) {
2217 reg54
|= (0x1 << dev
);
2219 reg54
&= ~(0x1 << dev
);
2221 if (udma_ok
&& udmamode
>= ATA_UDMA5
) {
2222 reg54
|= (0x1000 << dev
);
2224 reg54
&= ~(0x1000 << dev
);
2226 SetPciConfig2(0x54, reg54
);
2231 if(!(DeviceNumber
& 1)) {
2232 reg40
|= (isAtapi
? 0x04 : 0x00);
2234 new40
= timing
<< 8;
2236 reg40
|= (isAtapi
? 0x40 : 0x00);
2238 new44
= ((timing
& 0x30) >> 2) |
2241 SetPciConfig2(0x40, (reg40
& ~mask40
) | new40
);
2242 SetPciConfig1(0x44, (reg44
& ~mask44
) | new44
);
2249 /* HiNT Corp. VXPro II EIDE */
2250 if (wdmamode
>= 0 &&
2251 (AtapiReadPort1(chan
, IDX_BM_Status
) &
2252 (DeviceNumber
? BM_STATUS_DRIVE_1_DMA
: BM_STATUS_DRIVE_0_DMA
))) {
2253 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
);
2255 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2258 case ATA_JMICRON_ID
: {
2261 GetPciConfig1(0x40, reg40
);
2264 This is done on chip-init phase
2267 udmamode = min(udmamode, 2);
2270 /* Nothing to do to setup mode, the controller snoop SET_FEATURE cmd. */
2273 for(i
=udmamode
; i
>=0; i
--) {
2274 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2278 for(i
=wdmamode
; i
>=0; i
--) {
2279 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2283 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
2292 /* unknown controller chip */
2294 /* better not try generic DMA on ATAPI devices it almost never works */
2296 KdPrint2((PRINT_PREFIX
"ATAPI on unknown controller -> PIO\n"));
2301 /* if controller says its setup for DMA take the easy way out */
2302 /* the downside is we dont know what DMA mode we are in */
2303 if ((udmamode
>= 0 || /*wdmamode > 1*/ wdmamode
>= 0) &&
2304 /*deviceExtension->BaseIoAddressBM[lChannel]*/ (deviceExtension
->BusMaster
==DMA_MODE_BM
) &&
2305 (GetDmaStatus(deviceExtension
, lChannel
) &
2306 (!(DeviceNumber
& 1) ?
2307 BM_STATUS_DRIVE_0_DMA
: BM_STATUS_DRIVE_1_DMA
))) {
2308 // LunExt->TransferMode = ATA_DMA;
2310 KdPrint2((PRINT_PREFIX
"try DMA on unknown controller\n"));
2311 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
)) {
2317 /* well, we have no support for this, but try anyways */
2318 if ((wdmamode
>= 0 && apiomode
>= 4) && deviceExtension
->BaseIoAddressBM
[lChannel
]) {
2319 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
/* + wdmamode*/)) {
2325 KdPrint2((PRINT_PREFIX
"try PIO%d on unknown controller\n", apiomode
));
2326 if(!AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
2327 KdPrint2((PRINT_PREFIX
"fall to PIO on unknown controller\n"));
2328 LunExt
->TransferMode
= ATA_PIO
;
2331 } // end AtapiDmaInit()
2337 IN PHW_DEVICE_EXTENSION deviceExtension
,
2338 IN ULONG dev
, // physical device number (0-3)
2342 // ASSERT(dev/2 >= deviceExtension->Channel);
2343 // PHW_CHANNEL chan = &(deviceExtension->chan[dev/2-deviceExtension->Channel]);
2344 ULONG reg20
= 0x0000e132;
2345 ULONG reg24
= 0x00017771;
2347 if(mode
== ATA_PIO5
)
2351 case ATA_PIO0
: reg20
= 0x0000e132; break;
2352 case ATA_PIO1
: reg20
= 0x00018121; break;
2353 case ATA_PIO2
: reg20
= 0x00024020; break;
2354 case ATA_PIO3
: reg20
= 0x00032010; break;
2356 case ATA_PIO5
: reg20
= 0x00040010; break;
2357 case ATA_WDMA2
: reg24
= 0x00002020; break;
2358 case ATA_UDMA2
: reg24
= 0x00911030; break;
2360 AtapiWritePortEx4(NULL
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(dev
*8) + 0x20, reg20
);
2361 AtapiWritePortEx4(NULL
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(dev
*8) + 0x24, reg24
);
2367 IN PHW_DEVICE_EXTENSION deviceExtension
,
2368 IN ULONG dev
, // physical device number (0-3)
2372 PVOID HwDeviceExtension
= (PVOID
)deviceExtension
;
2373 ULONG slotNumber
= deviceExtension
->slotNumber
;
2374 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
2376 //ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
2378 ULONG port
= 0x60 + (dev
<<2);
2380 if(mode
== ATA_PIO5
)
2387 // **** FreeBSD code ****
2389 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
2396 case ATA_PIO0
: timing
= 0x004ff329; break;
2397 case ATA_PIO1
: timing
= 0x004fec25; break;
2398 case ATA_PIO2
: timing
= 0x004fe823; break;
2399 case ATA_PIO3
: timing
= 0x004fe622; break;
2400 case ATA_PIO4
: timing
= 0x004fe421; break;
2401 case ATA_WDMA0
: timing
= 0x004567f3; break;
2402 case ATA_WDMA1
: timing
= 0x004467f3; break;
2403 case ATA_WDMA2
: timing
= 0x004367f3; break;
2404 case ATA_UDMA0
: timing
= 0x004367f3; break;
2405 case ATA_UDMA1
: timing
= 0x004247f3; break;
2406 case ATA_UDMA2
: timing
= 0x004127f3; break;
2413 case ATA_PIO0
: timing
= 0x004fff2f; break;
2414 case ATA_PIO1
: timing
= 0x004ff82a; break;
2415 case ATA_PIO2
: timing
= 0x004ff026; break;
2416 case ATA_PIO3
: timing
= 0x004fec24; break;
2417 case ATA_PIO4
: timing
= 0x004fe822; break;
2418 case ATA_WDMA0
: timing
= 0x004acef6; break;
2419 case ATA_WDMA1
: timing
= 0x0048cef6; break;
2420 case ATA_WDMA2
: timing
= 0x0046cef6; break;
2421 case ATA_UDMA0
: timing
= 0x0046cef6; break;
2422 case ATA_UDMA1
: timing
= 0x00448ef6; break;
2423 case ATA_UDMA2
: timing
= 0x00436ef6; break;
2424 case ATA_UDMA3
: timing
= 0x00424ef6; break;
2425 case ATA_UDMA4
: timing
= 0x004127f3; break;
2426 case ATA_UDMA5
: timing
= 0x004127f3; break;
2435 SetPciConfig4(port
, timing
);
2438 // **** Linux code ****
2440 UCHAR r_bp
, r_cp
, r_ap
;
2443 static UCHAR udma_timing
[6][2] = {
2444 { 0x60, 0x03 }, /* 33 Mhz Clock */
2447 { 0x40, 0x02 }, /* 66 Mhz Clock */
2451 static UCHAR mdma_timing
[3][2] = {
2456 static USHORT pio_timing
[5] = {
2457 0x0913, 0x050C , 0x0308, 0x0206, 0x0104
2460 if(mode
> ATA_UDMA5
) {
2464 if(mode
> ATA_WDMA0
) {
2466 GetPciConfig1(port
+1, r_bp
);
2467 GetPciConfig1(port
+2, r_cp
);
2472 if(mode
>= ATA_UDMA0
) {
2473 i
= mode
- ATA_UDMA0
;
2474 r_bp
|= udma_timing
[i
][0];
2475 r_cp
|= udma_timing
[i
][1];
2478 i
= mode
- ATA_WDMA0
;
2479 r_bp
|= mdma_timing
[i
][0];
2480 r_cp
|= mdma_timing
[i
][1];
2482 SetPciConfig1(port
+1, r_bp
);
2483 SetPciConfig1(port
+2, r_cp
);
2485 if(mode
<= ATA_PIO5
) {
2486 GetPciConfig1(port
+0, r_ap
);
2487 GetPciConfig1(port
+1, r_bp
);
2489 i
= mode
- ATA_PIO0
;
2490 r_ap
&= ~0x3F; /* Preserve ERRDY_EN, SYNC_IN */
2492 r_ap
|= (UCHAR
)(pio_timing
[i
] >> 8);
2493 r_bp
|= (UCHAR
)(pio_timing
[i
] & 0xFF);
2495 // if (ata_pio_need_iordy(adev))
2496 r_ap
|= 0x20; /* IORDY enable */
2497 // if (adev->class == ATA_DEV_ATA)
2498 // r_ap |= 0x10; /* FIFO enable */
2500 SetPciConfig1(port
+0, r_ap
);
2501 SetPciConfig1(port
+1, r_bp
);
2506 } // end promise_timing()
2512 IN PHW_DEVICE_EXTENSION deviceExtension
,
2513 IN ULONG dev
, // physical device number (0-3)
2517 PVOID HwDeviceExtension
= (PVOID
)deviceExtension
;
2518 ULONG slotNumber
= deviceExtension
->slotNumber
;
2519 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
2521 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
2522 //ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
2526 if(mode
== ATA_PIO5
)
2532 switch (mode
) { /* HPT374 */
2533 case ATA_PIO0
: timing
= 0x0ac1f48a; break;
2534 case ATA_PIO1
: timing
= 0x0ac1f465; break;
2535 case ATA_PIO2
: timing
= 0x0a81f454; break;
2536 case ATA_PIO3
: timing
= 0x0a81f443; break;
2537 case ATA_PIO4
: timing
= 0x0a81f442; break;
2538 case ATA_WDMA0
: timing
= 0x228082ea; break;
2539 case ATA_WDMA1
: timing
= 0x22808254; break;
2540 case ATA_WDMA2
: timing
= 0x22808242; break;
2541 case ATA_UDMA0
: timing
= 0x121882ea; break;
2542 case ATA_UDMA1
: timing
= 0x12148254; break;
2543 case ATA_UDMA2
: timing
= 0x120c8242; break;
2544 case ATA_UDMA3
: timing
= 0x128c8242; break;
2545 case ATA_UDMA4
: timing
= 0x12ac8242; break;
2546 case ATA_UDMA5
: timing
= 0x12848242; break;
2547 case ATA_UDMA6
: timing
= 0x12808242; break;
2548 default: timing
= 0x0d029d5e;
2554 switch (mode
) { /* HPT372 */
2555 case ATA_PIO0
: timing
= 0x0d029d5e; break;
2556 case ATA_PIO1
: timing
= 0x0d029d26; break;
2557 case ATA_PIO2
: timing
= 0x0c829ca6; break;
2558 case ATA_PIO3
: timing
= 0x0c829c84; break;
2559 case ATA_PIO4
: timing
= 0x0c829c62; break;
2560 case ATA_WDMA0
: timing
= 0x2c82922e; break;
2561 case ATA_WDMA1
: timing
= 0x2c829266; break;
2562 case ATA_WDMA2
: timing
= 0x2c829262; break;
2563 case ATA_UDMA0
: timing
= 0x1c829c62; break;
2564 case ATA_UDMA1
: timing
= 0x1c9a9c62; break;
2565 case ATA_UDMA2
: timing
= 0x1c929c62; break;
2566 case ATA_UDMA3
: timing
= 0x1c8e9c62; break;
2567 case ATA_UDMA4
: timing
= 0x1c8a9c62; break;
2568 case ATA_UDMA5
: timing
= 0x1c8a9c62; break;
2569 case ATA_UDMA6
: timing
= 0x1c869c62; break;
2570 default: timing
= 0x0d029d5e;
2576 switch (mode
) { /* HPT370 */
2577 case ATA_PIO0
: timing
= 0x06914e57; break;
2578 case ATA_PIO1
: timing
= 0x06914e43; break;
2579 case ATA_PIO2
: timing
= 0x06514e33; break;
2580 case ATA_PIO3
: timing
= 0x06514e22; break;
2581 case ATA_PIO4
: timing
= 0x06514e21; break;
2582 case ATA_WDMA0
: timing
= 0x26514e97; break;
2583 case ATA_WDMA1
: timing
= 0x26514e33; break;
2584 case ATA_WDMA2
: timing
= 0x26514e21; break;
2585 case ATA_UDMA0
: timing
= 0x16514e31; break;
2586 case ATA_UDMA1
: timing
= 0x164d4e31; break;
2587 case ATA_UDMA2
: timing
= 0x16494e31; break;
2588 case ATA_UDMA3
: timing
= 0x166d4e31; break;
2589 case ATA_UDMA4
: timing
= 0x16454e31; break;
2590 case ATA_UDMA5
: timing
= 0x16454e31; break;
2591 default: timing
= 0x06514e57;
2597 GetPciConfig1(0x41 + (dev
<< 2), reg41
);
2600 case 0x85: /* 25Mhz */
2602 case ATA_PIO0
: timing
= 0x40d08585; break;
2603 case ATA_PIO1
: timing
= 0x40d08572; break;
2604 case ATA_PIO2
: timing
= 0x40ca8542; break;
2605 case ATA_PIO3
: timing
= 0x40ca8532; break;
2606 case ATA_PIO4
: timing
= 0x40ca8521; break;
2607 case ATA_WDMA2
: timing
= 0x20ca8521; break;
2608 case ATA_UDMA2
: timing
= 0x10cf8521; break;
2609 case ATA_UDMA4
: timing
= 0x10c98521; break;
2610 default: timing
= 0x01208585;
2614 case 0xa7: /* 33MHz */
2616 case ATA_PIO0
: timing
= 0x40d0a7aa; break;
2617 case ATA_PIO1
: timing
= 0x40d0a7a3; break;
2618 case ATA_PIO2
: timing
= 0x40d0a753; break;
2619 case ATA_PIO3
: timing
= 0x40c8a742; break;
2620 case ATA_PIO4
: timing
= 0x40c8a731; break;
2621 case ATA_WDMA0
: timing
= 0x20c8a797; break;
2622 case ATA_WDMA1
: timing
= 0x20c8a732; break;
2623 case ATA_WDMA2
: timing
= 0x20c8a731; break;
2624 case ATA_UDMA0
: timing
= 0x10c8a731; break;
2625 case ATA_UDMA1
: timing
= 0x10cba731; break;
2626 case ATA_UDMA2
: timing
= 0x10caa731; break;
2627 case ATA_UDMA3
: timing
= 0x10cfa731; break;
2628 case ATA_UDMA4
: timing
= 0x10c9a731; break;
2629 default: timing
= 0x0120a7a7;
2632 case 0xd9: /* 40Mhz */
2634 case ATA_PIO0
: timing
= 0x4018d9d9; break;
2635 case ATA_PIO1
: timing
= 0x4010d9c7; break;
2636 case ATA_PIO2
: timing
= 0x4010d997; break;
2637 case ATA_PIO3
: timing
= 0x4010d974; break;
2638 case ATA_PIO4
: timing
= 0x4008d963; break;
2639 case ATA_WDMA2
: timing
= 0x2008d943; break;
2640 case ATA_UDMA2
: timing
= 0x100bd943; break;
2641 case ATA_UDMA4
: timing
= 0x100fd943; break;
2642 default: timing
= 0x0120d9d9;
2648 SetPciConfig4(0x40 + (dev
<<2), timing
);
2649 } // end hpt_timing()
2652 #define FIT(v,min,max) (((v)>(max)?(max):(v))<(min)?(min):(v))
2657 IN PHW_DEVICE_EXTENSION deviceExtension
,
2658 IN ULONG dev
, // physical device number (0-3)
2662 PVOID HwDeviceExtension
= (PVOID
)deviceExtension
;
2663 ULONG slotNumber
= deviceExtension
->slotNumber
;
2664 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
2666 // Newer chips dislike this:
2667 if(/*!(deviceExtension->HwFlags & VIAAST)*/
2668 deviceExtension
->MaxTransferMode
< ATA_UDMA6
) {
2672 USHORT T
= 1000 / /* PciBusClockMHz()*/ 33;
2683 case ATA_PIO0
: setup
= 70; active
= 165; recover
= 150; cycle
= 600; break;
2684 case ATA_PIO1
: setup
= 50; active
= 125; recover
= 100; cycle
= 383; break;
2685 case ATA_PIO2
: setup
= 30; active
= 100; recover
= 90; cycle
= 240; break;
2686 case ATA_PIO3
: setup
= 30; active
= 80; recover
= 70; cycle
= 180; break;
2687 case ATA_PIO4
: setup
= 25; active
= 70; recover
= 25; cycle
= 120; break;
2688 case ATA_PIO5
: setup
= 20; active
= 50; recover
= 30; cycle
= 100; break;
2691 setup
= (setup
-1)/(T
+1);
2692 active
= (active
-1)/(T
+1);
2693 recover
= (recover
-1)/(T
+1);
2694 cycle
= (cycle
-1)/(T
+1);
2696 if (active
+ recover
< cycle
) {
2697 active
+= (cycle
- (active
+ recover
)) / 2;
2698 recover
= cycle
- active
;
2701 /* PIO address setup */
2702 GetPciConfig1(0x4c, t
);
2703 t
= (t
& ~(3 << ((3 - dev
) << 1))) | (FIT(setup
- 1, 0, 3) << ((3 - dev
) << 1));
2704 SetPciConfig1(0x4c, t
);
2706 /* PIO active & recover */
2707 SetPciConfig1(0x4b-dev
, (FIT(active
- 1, 0, 0xf) << 4) | FIT(recover
- 1, 0, 0xf) );
2708 } // end via82c_timing()