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 ph_addr
= MmGetPhysicalAddress(data
);
111 KdPrint3((PRINT_PREFIX
"AtapiVirtToPhysAddr_: %x -> %8.8x:%8.8x\n", data
, ph_addr
.HighPart
, ph_addr
.LowPart
));
112 if(!ph_addru
&& ph_addr
.HighPart
) {
113 // do so until we add 64bit address support
114 // or some workaround
119 (*ph_addru
) = ph_addr
.HighPart
;
120 //addr = ScsiPortConvertPhysicalAddressToUlong(ph_addr);
121 addr
= ph_addr
.LowPart
;
122 if(!addr
&& !ph_addr
.HighPart
) {
127 *count
= sizeof(BM_DMA_ENTRY
)*ATA_DMA_ENTRIES
;
129 *count
= PAGE_SIZE
- (addr
& (PAGE_SIZE
-1));
132 } // end AtapiVirtToPhysAddr_()
137 IN PVOID HwDeviceExtension
,
138 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
139 IN ULONG lChannel
// logical channel,
143 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
144 PHW_CHANNEL chan
= &(deviceExtension
->chan
[lChannel
]);
149 deviceExtension
->chan
[c
].CopyDmaBuffer
= FALSE
;
151 if(!deviceExtension
->Host64
&& (WinVer_Id() > WinVer_NT
)) {
152 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: allocate tmp buffers below 4Gb\n"));
153 chan
->DB_PRD
= MmAllocateContiguousMemory(sizeof(((PATA_REQ
)NULL
)->dma_tab
), ph4gb
);
155 chan
->DB_PRD_PhAddr
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(chan
->DB_PRD
), &i
, &ph_addru
);
156 if(!chan
->DB_PRD_PhAddr
|| !i
|| ((LONG
)(chan
->DB_PRD_PhAddr
) == -1)) {
157 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB PRD BASE\n" ));
159 chan
->DB_PRD_PhAddr
= 0;
163 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB PRD below 4Gb\n" ));
167 chan
->DB_IO
= MmAllocateContiguousMemory(deviceExtension
->MaximumDmaTransferLength
, ph4gb
);
169 chan
->DB_IO_PhAddr
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(chan
->DB_IO
), &i
, &ph_addru
);
170 if(!chan
->DB_IO_PhAddr
|| !i
|| ((LONG
)(chan
->DB_IO_PhAddr
) == -1)) {
171 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB IO BASE\n" ));
173 MmFreeContiguousMemory(chan
->DB_PRD
);
175 chan
->DB_PRD_PhAddr
= 0;
177 chan
->DB_IO_PhAddr
= 0;
181 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No DB IO below 4Gb\n" ));
182 MmFreeContiguousMemory(chan
->DB_IO
);
189 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
190 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: AHCI\n" ));
191 if(chan
->AhciCtlBlock
) {
192 KdPrint2((PRINT_PREFIX
" already initialized %x\n", chan
->AhciCtlBlock
));
195 // Need 1K-byte alignment
196 chan
->AhciCtlBlock0
= (PIDE_AHCI_CHANNEL_CTL_BLOCK
)MmAllocateContiguousMemory(
197 sizeof(IDE_AHCI_CHANNEL_CTL_BLOCK
)+AHCI_CLB_ALIGNEMENT_MASK
,
199 if(chan
->AhciCtlBlock0
) {
202 ULONGLONG AhciCtlBlock64
;
205 AhciCtlBlock
= (PUCHAR
)chan
->AhciCtlBlock0
;
207 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: CLP BASE %I64x\n", AhciCtlBlock64
));
209 AhciCtlBlock64
+= AHCI_CLB_ALIGNEMENT_MASK
;
210 AhciCtlBlock64
&= ~AHCI_CLB_ALIGNEMENT_MASK
;
212 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: CLP BASE 1k-aligned %I64x\n", AhciCtlBlock64
));
214 chan
->AhciCtlBlock
= (PIDE_AHCI_CHANNEL_CTL_BLOCK
)AhciCtlBlock
;
216 chan
->AHCI_CTL_PhAddr
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(chan
->AhciCtlBlock
), &i
, &ph_addru
);
217 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: CLP Phys BASE %I64x\n", chan
->AHCI_CTL_PhAddr
));
218 if(!chan
->AHCI_CTL_PhAddr
|| !i
|| ((LONG
)(chan
->AHCI_CTL_PhAddr
) == -1)) {
219 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No AHCI CLP BASE\n" ));
220 chan
->AhciCtlBlock
= NULL
;
221 chan
->AHCI_CTL_PhAddr
= 0;
225 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: No AHCI CLP below 4Gb\n" ));
226 MmFreeContiguousMemory(chan
->AhciCtlBlock0
);
227 chan
->AhciCtlBlock
= NULL
;
228 chan
->AHCI_CTL_PhAddr
= 0;
232 KdPrint2((PRINT_PREFIX
"AtapiDmaAlloc: Can't alloc AHCI CLP\n"));
237 } // end AtapiDmaAlloc()
242 IN PVOID HwDeviceExtension
,
243 IN ULONG DeviceNumber
,
244 IN ULONG lChannel
, // logical channel,
245 IN PSCSI_REQUEST_BLOCK Srb
,
247 IN ULONG count
/* bytes */
250 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
251 ULONG dma_count
, dma_base
, dma_baseu
;
252 ULONG dma_count0
, dma_base0
;
254 PHW_CHANNEL chan
= &(deviceExtension
->chan
[lChannel
]);
255 PATA_REQ AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
256 BOOLEAN use_DB_IO
= FALSE
;
257 BOOLEAN use_AHCI
= (deviceExtension
->HwFlags
& UNIATA_AHCI
) ? TRUE
: FALSE
;
258 ULONG orig_count
= count
;
259 ULONG max_entries
= use_AHCI
? ATA_AHCI_DMA_ENTRIES
: ATA_DMA_ENTRIES
;
260 //ULONG max_frag = use_AHCI ? (0x3fffff+1) : (4096); // DEBUG, replace 4096 for proper chipset-specific value
261 ULONG max_frag
= deviceExtension
->DmaSegmentLength
;
262 ULONG seg_align
= deviceExtension
->DmaSegmentAlignmentMask
;
264 if(AtaReq
->dma_entries
) {
265 AtaReq
->Flags
|= REQ_FLAG_DMA_OPERATION
;
266 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: already setup, %d entries\n", AtaReq
->dma_entries
));
269 AtaReq
->ata
.dma_base
= 0;
270 AtaReq
->Flags
&= ~REQ_FLAG_DMA_OPERATION
;
272 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: mode %#x, data %x, count %x, lCh %x, dev %x\n",
273 chan
->lun
[DeviceNumber
]->TransferMode
,
274 data
, count
, lChannel
, DeviceNumber
));
275 if(chan
->lun
[DeviceNumber
]->TransferMode
< ATA_DMA
) {
276 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: Not DMA mode, assume this is just preparation\n" ));
279 //KdPrint2((PRINT_PREFIX " checkpoint 1\n" ));
281 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: count=0\n" ));
284 //KdPrint2((PRINT_PREFIX " checkpoint 2\n" ));
285 if(count
> deviceExtension
->MaximumDmaTransferLength
) {
286 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: deviceExtension->MaximumDmaTransferLength > count\n" ));
289 //KdPrint2((PRINT_PREFIX " checkpoint 3\n" ));
290 if((ULONG
)data
& deviceExtension
->AlignmentMask
) {
291 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: unaligned data: %#x (%#x)\n", data
, deviceExtension
->AlignmentMask
));
295 //KdPrint2((PRINT_PREFIX " checkpoint 4\n" ));
297 KdPrint2((PRINT_PREFIX
" get Phys(AHCI_CMD=%x)\n", AtaReq
->ahci
.ahci_cmd_ptr
));
298 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)(AtaReq
->ahci
.ahci_cmd_ptr
), &i
, &dma_baseu
);
299 AtaReq
->ahci
.ahci_base64
= 0; // clear before setup
301 KdPrint2((PRINT_PREFIX
" get Phys(PRD=%x)\n", &(AtaReq
->dma_tab
) ));
302 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, NULL
, (PUCHAR
)&(AtaReq
->dma_tab
) /*chan->dma_tab*/, &i
, &dma_baseu
);
305 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: SRB built-in PRD above 4Gb: %8.8x%8.8x\n", dma_baseu
, dma_base
));
306 if(!deviceExtension
->Host64
) {
307 dma_base
= chan
->DB_PRD_PhAddr
;
308 AtaReq
->Flags
|= REQ_FLAG_DMA_DBUF_PRD
;
312 if(!dma_base
|| !i
|| ((LONG
)(dma_base
) == -1)) {
313 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: No BASE\n" ));
316 AtaReq
->ata
.dma_base
= dma_base
; // aliased to AtaReq->ahci.ahci_base64
318 KdPrint2((PRINT_PREFIX
" get Phys(data[0]=%x)\n", data
));
319 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, Srb
, data
, &dma_count
, &dma_baseu
);
320 if(dma_baseu
&& dma_count
) {
321 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: 1st block of buffer above 4Gb: %8.8x%8.8x cnt=%x\n", dma_baseu
, dma_base
, dma_count
));
322 if(!deviceExtension
->Host64
) {
325 dma_base
= chan
->DB_IO_PhAddr
;
326 data
= (PUCHAR
)(chan
->DB_IO
);
328 AtaReq
->ahci
.ahci_base64
= (ULONGLONG
)dma_base
| ((ULONGLONG
)dma_baseu
<< 32);
331 if(!dma_count
|| ((LONG
)(dma_base
) == -1)) {
332 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: No 1st block\n" ));
333 //AtaReq->dma_base = NULL;
334 AtaReq
->ahci
.ahci_base64
= NULL
;
338 dma_count
= min(count
, (PAGE_SIZE
- ((ULONG
)data
& PAGE_MASK
)));
343 dma_count0
= dma_count
;
344 dma_base0
= dma_base
;
347 /* KdPrint2((PRINT_PREFIX " segments %#x+%#x == %#x && %#x+%#x <= %#x\n",
348 dma_base0, dma_count0, dma_base,
349 dma_count0, dma_count, max_frag));*/
350 if(dma_base0
+dma_count0
== dma_base
&&
351 dma_count0
+dma_count
<= max_frag
) {
352 // 'i' should be always > 0 here
353 // for BM we cannot cross 64k boundary
354 if(dma_base
& seg_align
) {
355 //KdPrint2((PRINT_PREFIX " merge segments\n" ));
359 dma_base
= dma_base0
;
360 dma_count
+= dma_count0
;
364 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].base
= dma_base
;
365 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].baseu
= dma_baseu
;
366 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].Reserved1
= 0;
367 *((PULONG
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC_ULONG
)) = ((dma_count
-1) & 0x3fffff);
368 /* AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved2 = 0;
369 AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].I = 0;*/
370 KdPrint2((PRINT_PREFIX
" ph data[%d]=%x:%x (%x)\n", i
, dma_baseu
, dma_base
, AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC
));
372 AtaReq
->dma_tab
[i
].base
= dma_base
;
373 AtaReq
->dma_tab
[i
].count
= (dma_count
& 0xffff);
375 dma_count0
= dma_count
;
376 dma_base0
= dma_base
;
378 if (i
>= max_entries
) {
379 KdPrint2((PRINT_PREFIX
"too many segments in DMA table\n" ));
380 //AtaReq->dma_base = NULL;
381 AtaReq
->ahci
.ahci_base64
= NULL
;
384 KdPrint2((PRINT_PREFIX
" get Phys(data[n=%d+%x]=%x)\n", i
, dma_count0
, data
));
385 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, Srb
, data
, &dma_count
, &dma_baseu
);
386 if(dma_baseu
&& dma_count
) {
387 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: block of buffer above 4Gb: %8.8x%8.8x, cnt=%x\n", dma_baseu
, dma_base
, dma_count
));
388 if(!deviceExtension
->Host64
) {
390 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: *ERROR* special buffer above 4Gb: %8.8x%8.8x\n", dma_baseu
, dma_base
));
397 if(!dma_count
|| !dma_base
|| ((LONG
)(dma_base
) == -1)) {
398 //AtaReq->dma_base = NULL;
399 AtaReq
->ahci
.ahci_base64
= 0;
400 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: No NEXT block\n" ));
404 dma_count
= min(count
, PAGE_SIZE
);
405 data
+= min(count
, PAGE_SIZE
);
406 count
-= min(count
, PAGE_SIZE
);
408 KdPrint2((PRINT_PREFIX
" set TERM\n" ));
409 /* KdPrint2((PRINT_PREFIX " segments %#x+%#x == %#x && #x+%#x <= %#x\n",
410 dma_base0, dma_count0, dma_base,
411 dma_count0, dma_count, max_frag));*/
412 if(dma_base0
+dma_count0
== dma_base
&&
413 dma_count0
+dma_count
<= max_frag
) {
414 // 'i' should be always > 0 here
415 if(dma_base
& seg_align
) {
416 //KdPrint2((PRINT_PREFIX " merge segments\n" ));
420 dma_base
= dma_base0
;
421 dma_count
+= dma_count0
;
425 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].base
= dma_base
;
426 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].baseu
= dma_baseu
;
427 AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].Reserved1
= 0;
428 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].DBC = ((dma_count-1) & 0x3fffff);
429 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].Reserved2 = 0;
430 *((PULONG
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC_ULONG
)) = ((dma_count
-1) & 0x3fffff);
431 //AtaReq->ahci.ahci_cmd_ptr->prd_tab[i].I = 1; // interrupt when ready
432 KdPrint2((PRINT_PREFIX
" ph data[%d]=%x:%x (%x)\n", i
, dma_baseu
, dma_base
, AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
].DBC
));
433 if(((ULONG
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
) & ~PAGE_MASK
) != ((ULONG
)&(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
]) & ~PAGE_MASK
)) {
434 KdPrint2((PRINT_PREFIX
"PRD table crosses page boundary! %x vs %x\n",
435 &AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
, &(AtaReq
->ahci
.ahci_cmd_ptr
->prd_tab
[i
]) ));
436 //AtaReq->Flags |= REQ_FLAG_DMA_DBUF_PRD;
439 AtaReq
->dma_tab
[i
].base
= dma_base
;
440 AtaReq
->dma_tab
[i
].count
= (dma_count
& 0xffff) | ATA_DMA_EOT
;
441 if(((ULONG
)&(AtaReq
->dma_tab
) & ~PAGE_MASK
) != ((ULONG
)&(AtaReq
->dma_tab
[i
]) & ~PAGE_MASK
)) {
442 KdPrint2((PRINT_PREFIX
"DMA table crosses page boundary! %x vs %x\n",
443 &AtaReq
->dma_tab
, &(AtaReq
->dma_tab
[i
]) ));
444 //AtaReq->Flags |= REQ_FLAG_DMA_DBUF_PRD;
447 AtaReq
->dma_entries
= i
+1;
450 AtaReq
->Flags
|= REQ_FLAG_DMA_DBUF
;
452 AtaReq
->Flags
|= REQ_FLAG_DMA_OPERATION
;
454 KdPrint2((PRINT_PREFIX
"AtapiDmaSetup: OK\n" ));
457 } // end AtapiDmaSetup()
462 PVOID HwDeviceExtension
,
463 PSCSI_REQUEST_BLOCK Srb
,
469 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
476 // This must never be called after DMA operation !!!
477 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: data %#x, len %#x\n", data
, count
));
480 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !Srb\n" ));
484 AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
486 // do nothing on PCI (This can be changed. We cannot guarantee,
487 // that CommonBuffer will always point to User's buffer,
488 // however, this usually happens on PCI-32)
489 if(deviceExtension
->OrigAdapterInterfaceType
== PCIBus
) {
492 // do nothing for DMA
493 if(AtaReq
->Flags
& REQ_FLAG_DMA_OPERATION
) {
498 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !data\n" ));
503 dma_base
= AtapiVirtToPhysAddr(HwDeviceExtension
, Srb
, data
, &dma_count
);
505 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !dma_base for data %#x\n", data
));
508 DmaBuffer
= (PUCHAR
)ScsiPortGetVirtualAddress(HwDeviceExtension
,
509 ScsiPortConvertUlongToPhysicalAddress(dma_base
));
511 KdPrint2((PRINT_PREFIX
"AtapiDmaPioSync: !DmaBuffer for dma_base %#x\n", dma_base
));
514 len
= min(dma_count
, count
);
515 memcpy(DmaBuffer
, data
, len
);
522 } // end AtapiDmaPioSync()
528 PSCSI_REQUEST_BLOCK Srb
533 AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
534 if((Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) &&
535 (AtaReq
->Flags
& REQ_FLAG_DMA_DBUF
)) {
536 KdPrint2((PRINT_PREFIX
" AtapiDmaDBSync is issued.\n"));
538 KdPrint2((PRINT_PREFIX
" DBUF (Read)\n"));
539 RtlCopyMemory(AtaReq
->DataBuffer
, chan
->DB_IO
,
540 Srb
->DataTransferLength
);
543 } // end AtapiDmaDBSync()
548 IN PVOID HwDeviceExtension
,
550 PSCSI_REQUEST_BLOCK Srb
553 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
554 PATA_REQ AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
556 if(!AtaReq
->ata
.dma_base
) {
557 KdPrint2((PRINT_PREFIX
"AtapiDmaDBPreSync: *** !AtaReq->ata.dma_base\n"));
560 // GetStatus(chan, statusByte2);
561 if(AtaReq
->Flags
& REQ_FLAG_DMA_DBUF_PRD
) {
562 KdPrint2((PRINT_PREFIX
" DBUF_PRD\n"));
564 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
565 RtlCopyMemory(chan
->DB_PRD
, AtaReq
->ahci
.ahci_cmd_ptr
, sizeof(AtaReq
->ahci_cmd0
));
567 RtlCopyMemory(chan
->DB_PRD
, &(AtaReq
->dma_tab
), sizeof(AtaReq
->dma_tab
));
570 if(!(Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) &&
571 (AtaReq
->Flags
& REQ_FLAG_DMA_DBUF
)) {
572 KdPrint2((PRINT_PREFIX
" DBUF (Write)\n"));
574 RtlCopyMemory(chan
->DB_IO
, AtaReq
->DataBuffer
,
575 Srb
->DataTransferLength
);
578 } // end AtapiDmaDBPreSync()
583 IN PVOID HwDeviceExtension
,
584 IN ULONG DeviceNumber
,
585 IN ULONG lChannel
, // logical channel,
586 IN PSCSI_REQUEST_BLOCK Srb
589 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
590 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM = deviceExtension->BaseIoAddressBM[lChannel];
591 PATA_REQ AtaReq
= (PATA_REQ
)(Srb
->SrbExtension
);
592 PHW_CHANNEL chan
= &deviceExtension
->chan
[lChannel
];
594 ULONG VendorID
= deviceExtension
->DevID
& 0xffff;
595 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
596 // UCHAR statusByte2;
598 GetStatus(chan, statusByte2);
599 KdPrint2((PRINT_PREFIX "AtapiDmaStart: %s on %#x:%#x\n",
600 (Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? "read" : "write",
601 lChannel, DeviceNumber ));
603 if(!AtaReq
->ata
.dma_base
) {
604 KdPrint2((PRINT_PREFIX
"AtapiDmaStart: *** !AtaReq->ata.dma_base\n"));
607 KdPrint2((PRINT_PREFIX
"AtapiDmaStart: lchan=%d\n", lChannel
));
610 // GetStatus(chan, statusByte2);
611 if(AtaReq->Flags & REQ_FLAG_DMA_DBUF_PRD) {
612 KdPrint2((PRINT_PREFIX " DBUF_PRD\n"));
614 if(deviceExtension->HwFlags & UNIATA_AHCI) {
615 RtlCopyMemory(chan->DB_PRD, AtaReq->ahci.ahci_cmd_ptr, sizeof(AtaReq->ahci_cmd0));
617 RtlCopyMemory(chan->DB_PRD, &(AtaReq->dma_tab), sizeof(AtaReq->dma_tab));
620 if(!(Srb->SrbFlags & SRB_FLAGS_DATA_IN) &&
621 (AtaReq->Flags & REQ_FLAG_DMA_DBUF)) {
622 KdPrint2((PRINT_PREFIX " DBUF (Write)\n"));
624 RtlCopyMemory(chan->DB_IO, AtaReq->DataBuffer,
625 Srb->DataTransferLength);
629 chan
->ChannelCtrlFlags
|= CTRFLAGS_DMA_ACTIVE
;
633 if(ChipType
== PRNEW
) {
634 ULONG Channel
= deviceExtension
->Channel
+ lChannel
;
636 if(chan
->ChannelCtrlFlags
& CTRFLAGS_LBA48
) {
637 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(Channel
? 0x24 : 0x20),
638 ((Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) ? 0x05000000 : 0x06000000) | (Srb
->DataTransferLength
>> 1)
643 if(deviceExtension->MemIo) {
645 AtapiWritePort4(chan,
647 (AtapiReadPort4(chan,
648 IDX_BM_Command) & ~0x000000c0) |
649 ((Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? 0x00000080 : 0x000000c0) );
656 // set pointer to Pointer Table
657 AtapiWritePort4(chan
, IDX_BM_PRD_Table
,
660 // set transfer direction
661 AtapiWritePort1(chan
, IDX_BM_Command
,
662 (Srb
->SrbFlags
& SRB_FLAGS_DATA_IN
) ? BM_COMMAND_READ
: BM_COMMAND_WRITE
);
663 // clear Error & Intr bits (writeing 1 clears bits)
664 // set DMA capability bit
665 AtapiWritePort1(chan
, IDX_BM_Status
,
666 AtapiReadPort1(chan
, IDX_BM_Status
) |
667 (BM_STATUS_INTR
| BM_STATUS_ERR
) /*|
668 (DeviceNumber ? BM_STATUS_DRIVE_1_DMA : BM_STATUS_DRIVE_0_DMA)*/);
670 AtapiWritePort1(chan
, IDX_BM_Command
,
671 AtapiReadPort1(chan
, IDX_BM_Command
) |
672 BM_COMMAND_START_STOP
);
675 } // end AtapiDmaStart()
680 IN PVOID HwDeviceExtension
,
681 IN ULONG DeviceNumber
,
682 IN ULONG lChannel
, // logical channel,
683 IN PSCSI_REQUEST_BLOCK Srb
686 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
687 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM = deviceExtension->BaseIoAddressBM[lChannel];
688 PHW_CHANNEL chan
= &deviceExtension
->chan
[lChannel
];
691 ULONG VendorID
= deviceExtension
->DevID
& 0xffff;
692 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
694 KdPrint2((PRINT_PREFIX
"AtapiDmaDone: dev %d\n", DeviceNumber
));
696 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
697 KdPrint2((PRINT_PREFIX
" ACHTUNG! should not be called for AHCI!\n"));
698 return IDE_STATUS_WRONG
;
703 if(ChipType
== PRNEW
) {
704 ULONG Channel
= deviceExtension
->Channel
+ lChannel
;
706 AtapiWritePortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11,
707 AtapiReadPortEx1(chan, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressBM_0),0x11) &
708 ~(Channel ? 0x08 : 0x02));
710 if(chan
->ChannelCtrlFlags
& CTRFLAGS_LBA48
) {
711 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(Channel
? 0x24 : 0x20),
717 if(deviceExtension->MemIo) {
719 AtapiWritePort4(chan,
721 (AtapiReadPort4(chan,
722 IDX_BM_Command) & ~0x00000080) );
724 chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_ACTIVE;
732 dma_status
= AtapiReadPort1(chan
, IDX_BM_Status
) & BM_STATUS_MASK
;
734 AtapiWritePort1(chan
, IDX_BM_Command
,
735 AtapiReadPort1(chan
, IDX_BM_Command
) &
736 ~BM_COMMAND_START_STOP
);
737 // clear interrupt and error status
738 AtapiWritePort1(chan
, IDX_BM_Status
, BM_STATUS_ERR
| BM_STATUS_INTR
);
740 chan
->ChannelCtrlFlags
&= ~CTRFLAGS_DMA_ACTIVE
;
744 } // end AtapiDmaDone()
749 IN PHW_DEVICE_EXTENSION deviceExtension
,
750 IN PHW_LU_EXTENSION LunExt
,
756 if((deviceExtension
->HwFlags
& UNIATA_AHCI
) &&
757 !(LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
)) {
758 // skip unnecessary checks
759 KdPrint2((PRINT_PREFIX
"AtapiDmaReinit: ahci, nothing to do for HDD\n"));
763 apiomode
= (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
));
765 if(!(AtaReq
->Flags
& REQ_FLAG_DMA_OPERATION
)) {
766 KdPrint2((PRINT_PREFIX
767 "AtapiDmaReinit: !(AtaReq->Flags & REQ_FLAG_DMA_OPERATION), fall to PIO on Device %d\n", LunExt
->Lun
));
770 if(deviceExtension
->HwFlags
& UNIATA_AHCI
) {
771 if(!AtaReq
->ahci
.ahci_base64
) {
772 KdPrint2((PRINT_PREFIX
773 "AtapiDmaReinit: no AHCI PRD, fatal on Device %d\n", LunExt
->Lun
));
777 if(!AtaReq
->ata
.dma_base
) {
778 KdPrint2((PRINT_PREFIX
779 "AtapiDmaReinit: no PRD, fall to PIO on Device %d\n", LunExt
->Lun
));
783 if((deviceExtension
->HbaCtrlFlags
& HBAFLAGS_DMA_DISABLED_LBA48
) &&
784 (AtaReq
->lba
>= (LONGLONG
)ATA_MAX_LBA28
) &&
785 (LunExt
->TransferMode
> ATA_PIO5
) ) {
786 KdPrint2((PRINT_PREFIX
787 "AtapiDmaReinit: FORCE_DOWNRATE on Device %d for LBA48\n", LunExt
->Lun
));
792 if(AtaReq
->Flags
& REQ_FLAG_FORCE_DOWNRATE
) {
793 KdPrint2((PRINT_PREFIX
794 "AtapiDmaReinit: FORCE_DOWNRATE on Device %d\n", LunExt
->Lun
));
795 if(AtaReq
->lba
>= (LONGLONG
)ATA_MAX_LBA28
) {
797 LunExt
->DeviceFlags
|= REQ_FLAG_FORCE_DOWNRATE_LBA48
;
799 // do not make extra work if we already use PIO
800 if(/*LunExt->TransferMode >= ATA_DMA*/
801 (LunExt
->TransferMode
> ATA_PIO5
) && (LunExt
->TransferMode
!= ATA_PIO0
+apiomode
)
803 KdPrint2((PRINT_PREFIX
804 "AtapiDmaReinit: set PIO mode on Device %d (%x -> %x)\n", LunExt
->Lun
, LunExt
->TransferMode
, ATA_PIO0
+apiomode
));
805 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
810 if(LunExt
->LimitedTransferMode
< LunExt
->TransferMode
) {
811 KdPrint2((PRINT_PREFIX
812 "AtapiDmaReinit: set PIO mode on Device %d (%x -> %x) (2)\n", LunExt
->Lun
, LunExt
->TransferMode
, LunExt
->LimitedTransferMode
));
813 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
814 LunExt
->LimitedTransferMode
-ATA_PIO0
,
820 KdPrint2((PRINT_PREFIX
821 "AtapiDmaReinit: set MAX mode on Device %d\n", LunExt
->Lun
));
822 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
824 min( retry_Wdma
[AtaReq
->retry
],
825 (CHAR
)AtaWmode(&(LunExt
->IdentifyData
)) ),
826 min( retry_Udma
[AtaReq
->retry
],
827 (CHAR
)AtaUmode(&(LunExt
->IdentifyData
)) ) );
829 // LunExt->DeviceFlags &= ~DFLAGS_FORCE_DOWNRATE;
831 if(/*!(LunExt->DeviceFlags & DFLAGS_FORCE_DOWNRATE) &&*/
832 (LunExt
->LimitedTransferMode
>
833 LunExt
->TransferMode
) ||
834 (LunExt
->DeviceFlags
& DFLAGS_REINIT_DMA
) ||
835 ((deviceExtension
->HwFlags
& UNIATA_CHAN_TIMINGS
) && ((ULONG
)LunExt
->Lun
!= LunExt
->chan
->last_cdev
))) {
837 KdPrint2((PRINT_PREFIX
838 "AtapiDmaReinit: restore IO mode on Device %d, last dev %d\n", LunExt
->Lun
, LunExt
->chan
->last_cdev
));
839 AtapiDmaInit__(deviceExtension
, LunExt
);
841 KdPrint2((PRINT_PREFIX
842 "AtapiDmaReinit: LimitedTransferMode == TransferMode = %x (%x), Device %d, last dev %d\n", LunExt
->TransferMode
, LunExt
->DeviceFlags
, LunExt
->Lun
, LunExt
->chan
->last_cdev
));
847 } // end AtapiDmaReinit()
852 IN PHW_DEVICE_EXTENSION deviceExtension
,
853 IN PHW_LU_EXTENSION LunExt
856 if(LunExt
->IdentifyData
.SupportDma
||
857 (LunExt
->IdentifyData
.AtapiDMA
.DMASupport
&& (LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
))) {
858 KdPrint2((PRINT_PREFIX
859 "AtapiDmaInit__: Set (U)DMA on Device %d\n", LunExt
->Lun
));
860 /* for(i=AtaUmode(&(LunExt->IdentifyData)); i>=0; i--) {
861 AtapiDmaInit(deviceExtension, ldev & 1, ldev >> 1,
862 (CHAR)AtaPioMode(&(LunExt->IdentifyData)),
863 (CHAR)AtaWmode(&(LunExt->IdentifyData)),
864 UDMA_MODE0+(CHAR)i );
866 for(i=AtaWmode(&(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 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
873 (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
)),
874 (CHAR
)AtaWmode(&(LunExt
->IdentifyData
)),
875 (CHAR
)AtaUmode(&(LunExt
->IdentifyData
)) );
877 KdPrint2((PRINT_PREFIX
878 "AtapiDmaInit__: Set PIO on Device %d\n", LunExt
->Lun
));
879 AtapiDmaInit(deviceExtension
, LunExt
->Lun
, LunExt
->chan
->lChannel
,
880 (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
)), -1, -1);
882 } // end AtapiDmaInit__()
887 IN PHW_DEVICE_EXTENSION deviceExtension
,
888 IN ULONG DeviceNumber
,
889 IN ULONG lChannel
, // logical channel,
890 IN PHW_LU_EXTENSION LunExt
,
894 KdPrint3((PRINT_PREFIX
895 "AtaSetTransferMode: Set %#x on Device %d/%d\n", mode
, lChannel
, DeviceNumber
));
898 BOOLEAN disable_intr
= (deviceExtension
->HwFlags
& UNIATA_AHCI
) || (CPU_num
>1);
900 if(deviceExtension->HwFlags & UNIATA_SATA) {
901 // experimental do nothing, see ROS BUG-9119, v0.46a1
902 statusByte = IDE_STATUS_IDLE;
904 if(LunExt
->DeviceFlags
& DFLAGS_MANUAL_CHS
) {
905 statusByte
= mode
<= ATA_PIO2
? IDE_STATUS_IDLE
: IDE_STATUS_ERROR
;
909 AtapiDisableInterrupts(deviceExtension
, lChannel
);
911 if(mode
> ATA_UDMA6
) {
912 // for SATA, it doesn't have option to set transfer rate
913 // We need this just to switch between PIO and DMA modes
914 // Devices may support only some lower transfer rates (e.g. UDMA0-4)
915 umode
= min((UCHAR
)AtaUmode(&(LunExt
->IdentifyData
)), 6);
920 statusByte
= AtaCommand(deviceExtension
, DeviceNumber
, lChannel
,
921 IDE_COMMAND_SET_FEATURES
, 0, 0, 0,
922 (UCHAR
)umode
, ATA_C_F_SETXFER
, ATA_WAIT_BASE_READY
);
924 AtapiEnableInterrupts(deviceExtension
, lChannel
);
927 if(statusByte
& IDE_STATUS_ERROR
) {
928 KdPrint3((PRINT_PREFIX
" wait ready after error\n"));
929 if(LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
) {
930 AtapiStallExecution(10);
932 AtapiStallExecution(100);
934 apiomode
= (CHAR
)AtaPioMode(&(LunExt
->IdentifyData
));
935 if( (apiomode
> 0) &&
936 ((CHAR
)AtaWmode(&(LunExt
->IdentifyData
)) > 0) &&
937 ((CHAR
)AtaUmode(&(LunExt
->IdentifyData
)) > 0)
941 if(mode
> ATA_PIO2
) {
944 KdPrint3((PRINT_PREFIX
" assume that drive doesn't support mode swithing using PIO%d\n", apiomode
));
945 mode
= ATA_PIO0
+ apiomode
;
947 // SATA sets actual transfer rate in LunExt on init.
948 // There is no run-time SATA rate adjustment yet.
949 // On the other hand, we may turn SATA device in PIO mode
950 LunExt
->TransferMode
= (UCHAR
)mode
;
951 if(deviceExtension
->HwFlags
& UNIATA_SATA
) {
952 if(mode
< ATA_SA150
) {
953 LunExt
->PhyTransferMode
= max(LunExt
->PhyTransferMode
, LunExt
->TransferMode
);
955 LunExt
->PhyTransferMode
= LunExt
->TransferMode
;
958 if(LunExt
->DeviceFlags
& DFLAGS_ATAPI_DEVICE
) {
959 LunExt
->PhyTransferMode
= max(LunExt
->LimitedTransferMode
, LunExt
->TransferMode
);
961 LunExt
->PhyTransferMode
= LunExt
->TransferMode
;
965 } // end AtaSetTransferMode()
970 IN PVOID HwDeviceExtension
,
971 IN ULONG DeviceNumber
,
972 IN ULONG lChannel
, // logical channel,
973 // is always 0 except simplex-only controllers
979 PHW_DEVICE_EXTENSION deviceExtension
= (PHW_DEVICE_EXTENSION
)HwDeviceExtension
;
980 ULONG Channel
= deviceExtension
->Channel
+ lChannel
;
981 PHW_CHANNEL chan
= &deviceExtension
->chan
[lChannel
];
982 //LONG statusByte = 0;
983 ULONG dev
= Channel
*2 + DeviceNumber
; // for non-SATA/AHCI only!
984 //ULONG ldev = lChannel*2 + DeviceNumber; // for non-SATA/AHCI only!
985 BOOLEAN isAtapi
= ATAPI_DEVICE(chan
, DeviceNumber
);
986 ULONG slotNumber
= deviceExtension
->slotNumber
;
987 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
989 PHW_LU_EXTENSION LunExt
= chan
->lun
[DeviceNumber
];
992 ULONG VendorID
= deviceExtension
->DevID
& 0xffff;
993 //ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
994 //ULONG RevID = deviceExtension->RevID;
995 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
996 ULONG ChipFlags
= deviceExtension
->HwFlags
& CHIPFLAG_MASK
;
1000 //UCHAR *reg_val = NULL;
1002 LunExt
->DeviceFlags
&= ~DFLAGS_REINIT_DMA
;
1003 /* set our most pessimistic default mode */
1004 LunExt
->TransferMode
= ATA_PIO
;
1005 // if(!deviceExtension->BaseIoAddressBM[lChannel]) {
1006 if(!deviceExtension
->BusMaster
) {
1007 KdPrint2((PRINT_PREFIX
" !deviceExtension->BusMaster: NO DMA\n"));
1008 wdmamode
= udmamode
= -1;
1011 // Limit transfer mode (controller limitation)
1012 if((LONG
)chan
->MaxTransferMode
>= ATA_UDMA
) {
1013 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: chan->MaxTransferMode >= ATA_UDMA\n"));
1014 udmamode
= min( udmamode
, (CHAR
)(chan
->MaxTransferMode
- ATA_UDMA
));
1016 if((LONG
)chan
->MaxTransferMode
>= ATA_WDMA
) {
1017 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: chan->MaxTransferMode >= ATA_WDMA\n"));
1019 wdmamode
= min( wdmamode
, (CHAR
)(chan
->MaxTransferMode
- ATA_WDMA
));
1021 if((LONG
)chan
->MaxTransferMode
>= ATA_PIO0
) {
1022 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: NO DMA\n"));
1023 wdmamode
= udmamode
= -1;
1024 apiomode
= min( apiomode
, (CHAR
)(chan
->MaxTransferMode
- ATA_PIO0
));
1026 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: PIO0\n"));
1027 wdmamode
= udmamode
= -1;
1030 // Limit transfer mode (device limitation)
1031 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: LunExt->LimitedTransferMode %#x\n", LunExt
->LimitedTransferMode
));
1032 if((LONG
)LunExt
->LimitedTransferMode
>= ATA_UDMA
) {
1033 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: LunExt->MaxTransferMode >= ATA_UDMA => %#x\n",
1034 min( udmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_UDMA
))
1036 udmamode
= min( udmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_UDMA
));
1038 if((LONG
)LunExt
->LimitedTransferMode
>= ATA_WDMA
) {
1039 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: LunExt->MaxTransferMode >= ATA_WDMA => %#x\n",
1040 min( wdmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_WDMA
))
1043 wdmamode
= min( wdmamode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_WDMA
));
1045 if((LONG
)LunExt
->LimitedTransferMode
>= ATA_PIO0
) {
1046 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: lun NO DMA\n"));
1047 wdmamode
= udmamode
= -1;
1048 apiomode
= min( apiomode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_PIO0
));
1050 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: lun PIO0\n"));
1051 wdmamode
= udmamode
= -1;
1055 //if(!(ChipFlags & UNIATA_AHCI)) {
1057 // this is necessary for future PM support
1058 SelectDrive(chan
, DeviceNumber
);
1059 GetStatus(chan
, statusByte
);
1060 // we can see here IDE_STATUS_ERROR status after previous operation
1061 if(statusByte
& IDE_STATUS_ERROR
) {
1062 KdPrint2((PRINT_PREFIX
"IDE_STATUS_ERROR detected on entry, statusByte = %#x\n", statusByte
));
1063 //GetBaseStatus(chan, statusByte);
1065 if(statusByte
&& UniataIsIdle(deviceExtension
, statusByte
& ~IDE_STATUS_ERROR
) != IDE_STATUS_IDLE
) {
1066 KdPrint2((PRINT_PREFIX
"Can't setup transfer mode: statusByte = %#x\n", statusByte
));
1071 chan
->last_cdev
= DeviceNumber
;
1072 if(UniataIsSATARangeAvailable(deviceExtension
, lChannel
) ||
1073 (ChipFlags
& UNIATA_AHCI
) || (chan
->MaxTransferMode
>= ATA_SA150
)
1075 //if(ChipFlags & (UNIATA_SATA | UNIATA_AHCI)) {
1080 KdPrint2((PRINT_PREFIX
"SATA Generic\n"));
1082 if((udmamode
>= 5) || (ChipFlags
& UNIATA_AHCI
) || ((udmamode
>= 0) && (chan
->MaxTransferMode
>= ATA_SA150
))) {
1083 /* some drives report UDMA6, some UDMA5 */
1084 /* ATAPI may not have SataCapabilities set in IDENTIFY DATA */
1085 if(ata_is_sata(&(LunExt
->IdentifyData
))) {
1086 //udmamode = min(udmamode, 6);
1087 KdPrint2((PRINT_PREFIX
"LunExt->LimitedTransferMode %x, LunExt->OrigTransferMode %x\n",
1088 LunExt
->LimitedTransferMode
, LunExt
->OrigTransferMode
));
1089 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, min(LunExt
->LimitedTransferMode
, LunExt
->OrigTransferMode
))) {
1092 udmamode
= min(udmamode
, 6);
1095 KdPrint2((PRINT_PREFIX
"SATA -> PATA adapter ?\n"));
1096 if (udmamode
> 2 && (!LunExt
->IdentifyData
.HwResCableId
&& (LunExt
->IdentifyData
.HwResValid
== IDENTIFY_CABLE_ID_VALID
) )) {
1097 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: DMA limited to UDMA33, non-ATA66 compliant cable\n"));
1099 apiomode
= min( apiomode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_PIO0
));
1101 udmamode
= min(udmamode
, 6);
1106 ModeByte
= ATA_UDMA0
+ udmamode
;
1109 ModeByte
= ATA_WDMA0
+ wdmamode
;
1112 ModeByte
= ATA_PIO0
+ apiomode
;
1117 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ModeByte
);
1121 if(deviceExtension
->UnknownDev
) {
1122 KdPrint2((PRINT_PREFIX
"Unknown chip, omit Vendor/Dev checks\n"));
1123 goto try_generic_dma
;
1126 if(udmamode
> 2 && (!LunExt
->IdentifyData
.HwResCableId
&& (LunExt
->IdentifyData
.HwResValid
== IDENTIFY_CABLE_ID_VALID
)) ) {
1127 if(ata_is_sata(&(LunExt
->IdentifyData
))) {
1128 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: SATA beyond adapter or Controller compat mode\n"));
1130 KdPrint2((PRINT_PREFIX
"AtapiDmaInit: DMA limited to UDMA33, non-ATA66 compliant cable\n"));
1132 apiomode
= min( apiomode
, (CHAR
)(LunExt
->LimitedTransferMode
- ATA_PIO
));
1136 KdPrint2((PRINT_PREFIX
"Setup chip a:w:u=%d:%d:%d\n",
1142 case ATA_ACARD_ID
: {
1146 static const USHORT reg4a
= 0xa6;
1147 UCHAR reg
= 0x40 + (UCHAR
)dev
;
1149 if(ChipType
== ATPOLD
) {
1151 static const USHORT reg4x
= 0x0301;
1153 for(i
=udmamode
; i
>=0; i
--) {
1154 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA
+ i
)) {
1156 ChangePciConfig1(0x54, a
| (0x01 << dev
) | ((i
+1) << (dev
*2)));
1157 SetPciConfig1(0x4a, reg4a
);
1158 SetPciConfig2(reg
, reg4x
);
1163 if (wdmamode
>= 2 && apiomode
>= 4) {
1164 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1170 static const UCHAR reg4x
= 0x31;
1172 for(i
=udmamode
; i
>=0; i
--) {
1173 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA
+ i
)) {
1175 ChangePciConfig2(0x44, (a
& ~(0x000f << (dev
* 4))) | ((i
+1) << (dev
*4)));
1176 SetPciConfig1(0x4a, reg4a
);
1177 SetPciConfig1(reg
, reg4x
);
1182 if (wdmamode
>= 2 && apiomode
>= 4) {
1183 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1188 /* Use GENERIC PIO */
1190 case ATA_ACER_LABS_ID
: {
1191 /************************/
1192 /* Acer Labs Inc. (ALI) */
1193 /************************/
1194 static const UCHAR ali_udma
[] = {0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f};
1195 static const ULONG ali_pio
[] =
1196 { 0x006d0003, 0x00580002, 0x00440001, 0x00330001,
1197 0x00310001, 0x00440001};
1198 /* the older Aladdin doesn't support ATAPI DMA on both master & slave */
1199 if ((ChipFlags
& ALIOLD
) &&
1200 (udmamode
>= 0 || wdmamode
>= 0)) {
1201 if(ATAPI_DEVICE(chan
, 0) &&
1202 ATAPI_DEVICE(chan
, 1)) {
1203 // 2 devices on this channel - NO DMA
1204 chan
->MaxTransferMode
=
1205 min(chan
->MaxTransferMode
, ATA_PIO4
);
1206 udmamode
= wdmamode
= -1;
1210 for(i
=udmamode
; i
>=0; i
--) {
1211 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1214 GetPciConfig4(0x54, word54
);
1215 word54
&= ~(0x000f000f << (dev
* 4));
1216 word54
|= (((ali_udma
[i
]<<16) | 5) << (dev
* 4));
1217 SetPciConfig4(0x54, word54
);
1218 ChangePciConfig1(0x53, a
| 0x03);
1219 SetPciConfig4(0x58 + (Channel
<<2), 0x00310001);
1223 /* make sure eventual UDMA mode from the BIOS is disabled */
1224 ChangePciConfig2(0x56, a
& ~(0x0008 << (dev
* 4)) );
1225 if (wdmamode
>= 2 && apiomode
>= 4) {
1226 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1227 ChangePciConfig1(0x53, a
| 0x03);
1228 chan
->ChannelCtrlFlags
|= CTRFLAGS_DMA_RO
;
1232 ChangePciConfig1(0x53, (a
& ~0x01) | 0x02);
1234 for(i
=apiomode
; i
>=0; i
--) {
1235 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ i
)) {
1236 ChangePciConfig4(0x54, a
& ~(0x0008000f << (dev
* 4)));
1237 SetPciConfig4(0x58 + (Channel
<<2), ali_pio
[i
]);
1246 /********************/
1247 /* AMD, nVidia, VIA */
1248 /********************/
1249 if(VendorID
== ATA_VIA_ID
) {
1250 if((ChipFlags
& VIASATA
) &&
1252 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_SA150
);
1255 if((ChipFlags
& VIABAR
) &&
1257 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_SA150
);
1262 static const UCHAR via_modes
[6][7] = {
1263 { 0xc2, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00 }, /* ATA33 and New Chips */
1264 { 0xee, 0xec, 0xea, 0xe9, 0xe8, 0x00, 0x00 }, /* ATA66 */
1265 { 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0x00 }, /* ATA100 */
1266 { 0xf7, 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0 }, /* VIA ATA133 */
1267 { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }, /* AMD/nVIDIA */
1268 { 0xee, 0xe8, 0xe6, 0xe4, 0xe2, 0xe1, 0xe0 }}; /* VIA new */
1269 static const UCHAR via_pio
[] =
1270 { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20,
1271 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
1272 const UCHAR
*reg_val
= NULL
;
1273 UCHAR reg
= 0x53-(UCHAR
)dev
;
1274 UCHAR reg2
= reg
-0x08;
1276 if(ChipFlags
& VIABAR
) {
1281 reg_val
= &via_modes
[ChipType
][0];
1283 if(VendorID
== ATA_NVIDIA_ID
) {
1288 for(i
= udmamode
; i
>=0; i
--) {
1289 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1290 SetPciConfig1(reg2
, via_pio
[8+i
]);
1291 SetPciConfig1(reg
, (UCHAR
)reg_val
[i
]);
1295 if(!(ChipFlags
& VIABAR
)) {
1296 /* This chip can't do WDMA. */
1297 for(i
= wdmamode
; i
>=0; i
--) {
1298 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1299 SetPciConfig1(reg2
, via_pio
[5+i
]);
1300 SetPciConfig1(reg
, 0x8b);
1305 /* set PIO mode timings */
1306 if((apiomode
>= 0) && (ChipType
!= VIA133
)) {
1307 SetPciConfig1(reg2
, via_pio
[apiomode
]);
1309 if(VendorID
== ATA_VIA_ID
/*&& (ChipType == VIA33 || ChipType == VIA66)*/) {
1310 via82c_timing(deviceExtension
, dev
, ATA_PIO0
+ apiomode
);
1312 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1316 case ATA_CYRIX_ID
: {
1324 if(ChipType
== CYRIX_3x
) {
1325 ULONG cyr_piotiming
[] =
1326 { 0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010 };
1327 ULONG cyr_wdmatiming
[] = { 0x00077771, 0x00012121, 0x00002020 };
1328 ULONG cyr_udmatiming
[] = { 0x00921250, 0x00911140, 0x00911030 };
1329 ULONG mode_reg
= 0x24+(dev
<< 3);
1331 for(i
=udmamode
; i
>=0; i
--) {
1332 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1333 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
), mode_reg
, cyr_udmatiming
[udmamode
]);
1337 for(i
=wdmamode
; i
>=0; i
--) {
1338 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1339 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
), mode_reg
, cyr_wdmatiming
[wdmamode
]);
1343 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1344 AtapiWritePortEx4(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
), mode_reg
, cyr_piotiming
[apiomode
]);
1348 if(ChipType
== CYRIX_OLD
) {
1349 UCHAR cyr_piotiming_old
[] =
1353 for(i
=wdmamode
; i
>=0; i
--) {
1354 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1358 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1359 timing
= (6-apiomode
) | (cyr_piotiming_old
[i
]);
1360 /* Channel command timing */
1361 SetPciConfig1(0x62+Channel
, timing
);
1362 /* Read command timing */
1363 SetPciConfig1(0x64+Channel
*4+dev
, timing
);
1364 /* Write command timing */
1365 SetPciConfig1(0x66+Channel
*4+dev
, timing
);
1369 if(ChipType
== CYRIX_35
) {
1371 USHORT c35_pio_timings[5] = {
1372 0xF7F4, 0xF173, 0x8141, 0x5131, 0x1131
1374 USHORT c35_pio_cmd_timings[5] = {
1375 0xF7F4, 0x53F3, 0x13F1, 0x5131, 0x1131
1377 ULONG c35_udma_timings[5] = {
1378 0x7F7436A1, 0x7F733481, 0x7F723261, 0x7F713161, 0x7F703061
1380 ULONG c35_mwdma_timings[3] = {
1381 0x7F0FFFF3, 0x7F035352, 0x7F024241
1383 ULONG mode_reg = 0x24+(dev << 3);
1385 /* No MSR support yet, do not touch any regs */
1386 for(i
=udmamode
; i
>=0; i
--) {
1387 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1391 for(i
=wdmamode
; i
>=0; i
--) {
1392 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1396 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1403 case ATA_NATIONAL_ID
: {
1408 ULONG nat_piotiming
[] =
1409 { 0x9172d132, 0x21717121, 0x00803020, 0x20102010, 0x00100010,
1410 0x00803020, 0x20102010, 0x00100010,
1411 0x00100010, 0x00100010, 0x00100010 };
1412 ULONG nat_dmatiming
[] = { 0x80077771, 0x80012121, 0x80002020 };
1413 ULONG nat_udmatiming
[] = { 0x80921250, 0x80911140, 0x80911030 };
1417 for(i
=udmamode
; i
>=0; i
--) {
1418 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1419 SetPciConfig4(0x44 + (dev
* 8), nat_udmatiming
[i
]);
1420 SetPciConfig4(0x40 + (dev
* 8), nat_piotiming
[i
+8]);
1424 for(i
=wdmamode
; i
>=0; i
--) {
1425 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1426 SetPciConfig4(0x44 + (dev
* 8), nat_dmatiming
[i
]);
1427 SetPciConfig4(0x40 + (dev
* 8), nat_piotiming
[i
+5]);
1431 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
1432 ChangePciConfig4(0x44 + (dev
* 8), a
| 0x80000000);
1433 SetPciConfig4(0x40 + (dev
* 8), nat_piotiming
[apiomode
]);
1439 /* Use GENERIC PIO */
1441 case ATA_CYPRESS_ID
:
1445 if (wdmamode
>= 2 && apiomode
>= 4) {
1446 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1447 SetPciConfig2(Channel
? 0x4e:0x4c, 0x2020);
1451 /* Use GENERIC PIO */
1453 case ATA_MARVELL_ID
:
1457 for(i
=udmamode
; i
>=0; i
--) {
1458 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1462 for(i
=wdmamode
; i
>=0; i
--) {
1463 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1467 /* try generic DMA, use hpt_timing() */
1468 if (wdmamode
>= 0 && apiomode
>= 4) {
1469 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
)) {
1473 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1476 case ATA_NETCELL_ID
:
1480 if (wdmamode
>= 2 && apiomode
>= 4) {
1481 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA2
)) {
1485 /* Use GENERIC PIO */
1487 case ATA_HIGHPOINT_ID
: {
1488 /********************/
1489 /* High Point (HPT) */
1490 /********************/
1491 for(i
=udmamode
; i
>=0; i
--) {
1492 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1493 hpt_timing(deviceExtension
, dev
, (UCHAR
)(ATA_UDMA
+ i
)); // ???
1498 for(i
=wdmamode
; i
>=0; i
--) {
1499 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1500 hpt_timing(deviceExtension
, dev
, (UCHAR
)(ATA_WDMA0
+i
));
1504 /* try generic DMA, use hpt_timing() */
1505 if (wdmamode
>= 0 && apiomode
>= 4) {
1506 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
)) {
1510 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1511 hpt_timing(deviceExtension
, dev
, ATA_PIO0
+ apiomode
);
1514 case ATA_INTEL_ID
: {
1519 KdPrint2((PRINT_PREFIX
"Intel %d\n", Channel
));
1520 BOOLEAN udma_ok
= FALSE
;
1531 UCHAR intel_timings
[] = { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23,
1532 0x23, 0x23, 0x23, 0x23, 0x23, 0x23 };
1533 UCHAR intel_utimings
[] = { 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02 };
1534 const UCHAR needed_pio
[3] = {
1535 ATA_PIO0
, ATA_PIO3
, ATA_PIO4
1538 if(deviceExtension
->DevID
== ATA_I82371FB
) {
1539 KdPrint2((PRINT_PREFIX
" I82371FB\n"));
1542 for(i
=wdmamode
; i
>=0; i
--) {
1544 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1550 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1553 /* If the drive MWDMA is faster than it can do PIO then
1554 we must force PIO into PIO0 */
1555 if (apiomode
< needed_pio
[wdmamode
]) {
1556 /* Enable DMA timing only */
1557 control
|= 8; /* PIO cycles in PIO0 */
1560 GetPciConfig2(0x40+Channel
*2, reg4x
);
1561 if(apiomode
> ATA_PIO0
) {
1562 control
= 0x03; /* IORDY|TIME0 */
1564 control
= 0x02; /* IORDY */
1566 // if (ata_pio_need_iordy(adev))
1567 //control |= 2; /* IE */
1569 control
|= 4; /* PPE enable */
1571 /* Mask out the relevant control and timing bits we will load. Also
1572 clear the other drive TIME register as a precaution */
1573 reg4x
&= 0xCC00 | (0x0E << (DeviceNumber
*4));
1574 reg4x
|= control
<< (DeviceNumber
*4);
1575 reg4x
|= intel_timings
[idx
] << 8;
1576 SetPciConfig2(0x40+Channel
*2, reg4x
);
1580 if(deviceExtension
->DevID
== ATA_ISCH
) {
1582 KdPrint2((PRINT_PREFIX
" ISCH\n"));
1583 GetPciConfig4(0x80 + dev
*4, tim
);
1585 for(i
=udmamode
; i
>=0; i
--) {
1586 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1588 tim
&= ~(0x7 << 16);
1593 apiomode
= ATA_PIO4
;
1598 for(i
=wdmamode
; i
>=0; i
--) {
1599 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1600 tim
&= ~(0x1 << 31);
1606 apiomode
= (i
== 0) ? ATA_PIO0
:
1607 (i
== 1) ? ATA_PIO3
: ATA_PIO4
;
1613 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1617 tim
|= (apiomode
& 0x7);
1618 SetPciConfig4(0x80 + dev
*4, tim
);
1623 GetPciConfig2(0x48, reg48
);
1624 // if(!(ChipFlags & ICH4_FIX)) {
1625 GetPciConfig2(0x4a, reg4a
);
1627 GetPciConfig2(0x54, reg54
);
1628 // if(udmamode >= 0) {
1629 // enable the write buffer to be used in a split (ping/pong) manner.
1635 // reg40 &= ~0x00ff00ff;
1636 // reg40 |= 0x40774077;
1638 for(i
=udmamode
; i
>=0; i
--) {
1639 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1641 /* Set UDMA reference clock (33 MHz or more). */
1642 SetPciConfig1(0x48, reg48
| (0x0001 << dev
));
1643 // if(!(ChipFlags & ICH4_FIX)) {
1644 if(deviceExtension
->MaxTransferMode
== ATA_UDMA3
) {
1645 // Special case (undocumented overclock !) for PIIX4e
1646 SetPciConfig2(0x4a, (reg4a
| (0x03 << (dev
<<2)) ) );
1648 SetPciConfig2(0x4a, (reg4a
& ~(0x03 << (dev
<<2))) |
1649 (((USHORT
)(intel_utimings
[i
])) << (dev
<<2) ) );
1652 /* Set UDMA reference clock (66 MHz or more). */
1653 reg54
&= ~(0x1001 << dev
);
1655 reg54
|= (0x1 << dev
);
1657 /* Set UDMA reference clock (133 MHz). */
1659 reg54
|= (0x1000 << dev
);
1661 SetPciConfig2(0x54, reg54
);
1665 if(ChipFlags
& ICH4_FIX
) {
1666 KdPrint2((PRINT_PREFIX
" ICH4_FIX udma\n"));
1674 SetPciConfig1(0x48, reg48
& ~(0x0001 << dev
));
1675 if(!(ChipFlags
& ICH4_FIX
)) {
1676 SetPciConfig2(0x4a, (reg4a
& ~(0x3 << (dev
<< 2))) );
1678 SetPciConfig2(0x54, reg54
& ~(0x1001 << dev
));
1679 for(i
=wdmamode
; i
>=0; i
--) {
1680 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1683 if(ChipFlags
& ICH4_FIX
) {
1684 KdPrint2((PRINT_PREFIX
" ICH4_FIX wdma\n"));
1693 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1697 GetPciConfig4(0x40, reg40
);
1698 GetPciConfig1(0x44, reg44
);
1700 /* Allow PIO/WDMA timing controls. */
1701 reg40
&= ~0x00ff00ff;
1702 reg40
|= 0x40774077;
1704 mask40
= 0x000000ff;
1705 /* Set PIO/WDMA timings. */
1706 if(!(DeviceNumber
& 1)) {
1707 mask40
= 0x00003300;
1708 new40
= ((USHORT
)(intel_timings
[idx
]) << 8);
1711 new44
= ((intel_timings
[idx
] & 0x30) >> 2) |
1712 (intel_timings
[idx
] & 0x03);
1722 KdPrint2((PRINT_PREFIX
" 0x40 %x/%x, 0x44 %x/%x\n", mask40
, new40
, mask44
, new44
));
1723 SetPciConfig4(0x40, (reg40
& ~mask40
) | new40
);
1724 SetPciConfig1(0x44, (reg44
& ~mask44
) | new44
);
1728 case ATA_PROMISE_ID
: {
1733 UCHAR sel66
= Channel
? 0x08: 0x02;
1735 if(ChipType
< PRTX
) {
1741 for(i
=udmamode
; i
>=0; i
--) {
1743 if(ChipType
== PRNEW
) {
1745 AtapiWritePortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11,
1746 AtapiReadPortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11) |
1749 AtapiWritePortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11,
1750 AtapiReadPortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11) &
1755 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1756 promise_timing(deviceExtension
, dev
, (UCHAR
)(ATA_UDMA
+ i
)); // ???
1760 if(ChipType
== PRNEW
) {
1761 AtapiWritePortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11,
1762 AtapiReadPortEx1(chan
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),0x11) &
1765 for(i
=wdmamode
; i
>=0; i
--) {
1766 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1767 promise_timing(deviceExtension
, dev
, (UCHAR
)(ATA_WDMA0
+i
));
1771 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1772 promise_timing(deviceExtension
, dev
, ATA_PIO0
+ apiomode
);
1777 KdPrint2((PRINT_PREFIX
"ATI\n"));
1778 if(ChipType
== SIIMIO
) {
1779 goto l_ATA_SILICON_IMAGE_ID
;
1781 //goto ATA_SERVERWORKS_ID;
1786 case ATA_SERVERWORKS_ID
: {
1790 // static const ULONG udma_modes[] = { 0x70, 0x21, 0x20 };
1791 static const ULONG sw_dma_modes
[] = { 0x70, 0x21, 0x20 };
1792 static const ULONG sw_pio_modes
[] = { 0x5d, 0x47, 0x34, 0x22, 0x20, 0x34, 0x22, 0x20,
1793 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
1797 ULONG offset
= dev
^ 0x01;
1798 ULONG bit_offset
= offset
* 8;
1800 for(i
=udmamode
; i
>=0; i
--) {
1801 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1802 GetPciConfig2(0x56, reg56
);
1803 reg56
&= ~(0xf << (dev
* 4));
1804 reg56
|= ((USHORT
)i
<< (dev
* 4));
1805 SetPciConfig2(0x56, reg56
);
1806 ChangePciConfig1(0x54, a
| (0x01 << dev
));
1808 GetPciConfig4(0x44, reg44
);
1809 reg44
= (reg44
& ~(0xff << bit_offset
)) |
1810 (sw_dma_modes
[2] << bit_offset
);
1811 SetPciConfig4(0x44, reg44
);
1813 GetPciConfig4(0x40, reg40
);
1814 reg40
= (reg40
& ~(0xff << bit_offset
)) |
1815 (sw_pio_modes
[8+i
] << bit_offset
);
1816 SetPciConfig4(0x40, reg40
);
1821 for(i
=wdmamode
; i
>=0; i
--) {
1822 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1824 ChangePciConfig1(0x54, a
& ~(0x01 << dev
));
1826 GetPciConfig4(0x44, reg44
);
1827 reg44
= (reg44
& ~(0xff << bit_offset
)) |
1828 (sw_dma_modes
[wdmamode
] << bit_offset
);
1829 SetPciConfig4(0x44, reg44
);
1831 GetPciConfig4(0x40, reg40
);
1832 reg40
= (reg40
& ~(0xff << bit_offset
)) |
1833 (sw_pio_modes
[5+i
] << bit_offset
);
1834 SetPciConfig4(0x40, reg40
);
1838 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1839 // SetPciConfig4(0x44, sw_pio_modes[apiomode]);
1840 if(VendorID
== ATA_ATI_ID
) {
1841 // special case for ATI
1842 // Seems, that PATA ATI are just re-brended ServerWorks
1845 GetPciConfig2(0x4a, reg4a
);
1846 reg4a
= (reg4a
& ~(0xf << (dev
*4))) |
1847 (apiomode
<< (dev
*4));
1848 SetPciConfig2(0x4a, reg4a
);
1852 GetPciConfig4(0x40, reg40
);
1853 reg40
= (reg40
& ~(0xff << bit_offset
)) |
1854 (sw_pio_modes
[apiomode
] << bit_offset
);
1855 SetPciConfig4(0x40, reg40
);
1858 case ATA_SILICON_IMAGE_ID
: {
1859 l_ATA_SILICON_IMAGE_ID
:
1860 /********************/
1861 /* SiliconImage/CMD */
1862 /********************/
1863 if(ChipType
== SIIMIO
) {
1865 static const UCHAR sil_modes
[7] =
1866 { 0xf, 0xb, 0x7, 0x5, 0x3, 0x2, 0x1 };
1867 static const USHORT sil_wdma_modes
[3] =
1868 { 0x2208, 0x10c2, 0x10c1 };
1869 static const USHORT sil_pio_modes
[6] =
1870 { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1, 0x10c1 };
1872 UCHAR ureg
= 0xac + ((UCHAR
)DeviceNumber
* 0x02) + ((UCHAR
)Channel
* 0x10);
1874 UCHAR mreg
= Channel
? 0x84 : 0x80;
1875 UCHAR mask
= DeviceNumber
? 0x30 : 0x03;
1878 GetPciConfig1(ureg
, uval
);
1879 GetPciConfig1(mreg
, mode
);
1881 /* enable UDMA mode */
1882 for(i
= udmamode
; i
>=0; i
--) {
1884 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1885 SetPciConfig1(mreg
, mode
| mask
);
1886 SetPciConfig1(ureg
, (uval
& 0x3f) | sil_modes
[i
]);
1890 /* enable WDMA mode */
1891 for(i
= wdmamode
; i
>=0; i
--) {
1893 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1894 SetPciConfig1(mreg
, mode
| (mask
& 0x22));
1895 SetPciConfig2(ureg
- 0x4, sil_wdma_modes
[i
]);
1899 /* restore PIO mode */
1900 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1902 SetPciConfig1(mreg
, mode
| (mask
& 0x11));
1903 SetPciConfig2(ureg
- 0x8, sil_pio_modes
[apiomode
]);
1908 static const UCHAR cmd_modes
[2][6] = {
1909 { 0x31, 0x21, 0x011, 0x25, 0x15, 0x05 },
1910 { 0xc2, 0x82, 0x042, 0x8a, 0x4a, 0x0a } };
1911 static const UCHAR cmd_wdma_modes
[] = { 0x87, 0x32, 0x3f };
1912 static const UCHAR cmd_pio_modes
[] = { 0xa9, 0x57, 0x44, 0x32, 0x3f };
1913 ULONG treg
= 0x54 + ((dev
< 3) ? (dev
<< 1) : 7);
1915 udmamode
= min(udmamode
, 5);
1916 /* enable UDMA mode */
1917 for(i
= udmamode
; i
>=0; i
--) {
1920 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
1921 GetPciConfig1(Channel
? 0x7b : 0x73, umode
);
1922 umode
&= ~(!(DeviceNumber
& 1) ? 0x35 : 0xca);
1923 umode
|= ( cmd_modes
[DeviceNumber
& 1][i
]);
1924 SetPciConfig1(Channel
? 0x7b : 0x73, umode
);
1928 /* make sure eventual UDMA mode from the BIOS is disabled */
1929 ChangePciConfig1(Channel
? 0x7b : 0x73, a
& ~(!(DeviceNumber
& 1) ? 0x35 : 0xca));
1931 for(i
= wdmamode
; i
>=0; i
--) {
1933 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
1934 SetPciConfig1(treg
, cmd_wdma_modes
[i
]);
1935 ChangePciConfig1(Channel
? 0x7b : 0x73, a
& ~(!(DeviceNumber
& 1) ? 0x35 : 0xca));
1939 /* set PIO mode timings */
1940 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
1942 SetPciConfig1(treg
, cmd_pio_modes
[apiomode
]);
1943 ChangePciConfig1(Channel
? 0x7b : 0x73, a
& ~(!(DeviceNumber
& 1) ? 0x35 : 0xca));
1953 PULONG sis_modes
= NULL
;
1954 static const ULONG sis_modes_new133
[] =
1955 { 0x28269008, 0x0c266008, 0x04263008, 0x0c0a3008, 0x05093008,
1956 0x22196008, 0x0c0a3008, 0x05093008, 0x050939fc, 0x050936ac,
1957 0x0509347c, 0x0509325c, 0x0509323c, 0x0509322c, 0x0509321c};
1958 static const ULONG sis_modes_old133
[] =
1959 { 0x00cb, 0x0067, 0x0044, 0x0033, 0x0031, 0x0044, 0x0033, 0x0031,
1960 0x8f31, 0x8a31, 0x8731, 0x8531, 0x8331, 0x8231, 0x8131 };
1961 static const ULONG sis_modes_old
[] =
1962 { 0x0c0b, 0x0607, 0x0404, 0x0303, 0x0301, 0x0404, 0x0303, 0x0301,
1963 0xf301, 0xd301, 0xb301, 0xa301, 0x9301, 0x8301 };
1964 static const ULONG sis_modes_new100
[] =
1965 { 0x00cb, 0x0067, 0x0044, 0x0033, 0x0031, 0x0044, 0x0033, 0x0031,
1966 0x8b31, 0x8731, 0x8531, 0x8431, 0x8231, 0x8131 };
1975 sis_modes
= (PULONG
)(&sis_modes_new133
[0]);
1977 GetPciConfig1(0x57, reg57
);
1978 reg
= (reg57
& 0x40 ? 0x70 : 0x40) + (dev
* 4);
1981 sis_modes
= (PULONG
)(&sis_modes_old133
[0]);
1983 reg
= 0x40 + (dev
* 2);
1986 sis_modes
= (PULONG
)(&sis_modes_new100
[0]);
1988 reg
= 0x40 + (dev
* 2);
1993 sis_modes
= (PULONG
)(&sis_modes_old
[0]);
1995 reg
= 0x40 + (dev
* 2);
2000 for(i
=udmamode
; i
>=0; i
--) {
2001 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2003 SetPciConfig4(reg
, sis_modes
[offs
+i
]);
2005 SetPciConfig2(reg
, (USHORT
)sis_modes
[offs
+i
]);
2012 for(i
=wdmamode
; i
>=0; i
--) {
2013 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2015 SetPciConfig4(reg
, sis_modes
[offs
+i
]);
2017 SetPciConfig2(reg
, (USHORT
)sis_modes
[offs
+i
]);
2022 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2024 SetPciConfig4(reg
, sis_modes
[apiomode
]);
2026 SetPciConfig2(reg
, (USHORT
)sis_modes
[apiomode
]);
2031 /* Cenatek Rocket Drive controller */
2032 if (wdmamode
>= 0 &&
2033 (AtapiReadPort1(chan
, IDX_BM_Status
) &
2034 (DeviceNumber
? BM_STATUS_DRIVE_1_DMA
: BM_STATUS_DRIVE_0_DMA
))) {
2035 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ wdmamode
);
2037 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2040 case ATA_ITE_ID
: { /* ITE IDE controller */
2042 if(ChipType
== ITE_33
) {
2043 int a_speed
= 3 << (dev
* 4);
2044 int u_flag
= 1 << dev
;
2048 USHORT drive_enables
;
2051 GetPciConfig1(0x48, reg48
);
2052 GetPciConfig1(0x4a, reg4a
);
2055 * Setting the DMA cycle time to 2 or 3 PCI clocks (60 and 91 nsec
2056 * at 33 MHz PCI clock) seems to cause BadCRC errors during DMA
2057 * transfers on some drives, even though both numbers meet the minimum
2058 * ATAPI-4 spec of 73 and 54 nsec for UDMA 1 and 2 respectively.
2059 * So the faster times are just commented out here. The good news is
2060 * that the slower cycle time has very little affect on transfer
2064 for(i
=udmamode
; i
>=0; i
--) {
2065 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2066 SetPciConfig1(0x48, reg48
| u_flag
);
2068 SetPciConfig1(0x4a, reg4a
| u_speed
);
2070 goto setup_drive_ite
;
2074 for(i
=wdmamode
; i
>=0; i
--) {
2075 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2076 SetPciConfig1(0x48, reg48
& ~u_flag
);
2077 SetPciConfig1(0x4a, reg4a
& ~a_speed
);
2082 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2083 SetPciConfig1(0x48, reg48
& ~u_flag
);
2084 SetPciConfig1(0x4a, reg4a
& ~a_speed
);
2090 GetPciConfig2(0x40, drive_enables
);
2091 GetPciConfig4(0x44, drive_timing
);
2094 * FIX! The DIOR/DIOW pulse width and recovery times in port 0x44
2095 * are being left at the default values of 8 PCI clocks (242 nsec
2096 * for a 33 MHz clock). These can be safely shortened at higher
2097 * PIO modes. The DIOR/DIOW pulse width and recovery times only
2098 * apply to PIO modes, not to the DMA modes.
2102 * Enable port 0x44. The IT8172G spec is confused; it calls
2103 * this register the "Slave IDE Timing Register", but in fact,
2104 * it controls timing for both master and slave drives.
2106 drive_enables
|= 0x4000;
2108 drive_enables
&= (0xc000 | (0x06 << (DeviceNumber
*4)));
2110 /* enable prefetch and IORDY sample-point */
2111 drive_enables
|= (0x06 << (DeviceNumber
*4));
2114 SetPciConfig2(0x40, drive_enables
);
2116 if(ChipType
== ITE_133
) {
2117 static const UCHAR udmatiming
[] =
2118 { 0x44, 0x42, 0x31, 0x21, 0x11, 0xa2, 0x91 };
2119 static const UCHAR chtiming
[] =
2120 { 0xaa, 0xa3, 0xa1, 0x33, 0x31, 0x88, 0x32, 0x31 };
2121 ULONG offset
= (Channel
<<2) + DeviceNumber
;
2124 for(i
=udmamode
; i
>=0; i
--) {
2125 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2126 ChangePciConfig1(0x50, a
& ~(1 << (dev
+ 3)) );
2127 SetPciConfig1(0x56 + offset
, udmatiming
[i
]);
2132 for(i
=wdmamode
; i
>=0; i
--) {
2133 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2135 ChangePciConfig1(0x50, a
| (1 << (dev
+ 3)) );
2136 GetPciConfig1(0x54 + offset
, reg54
);
2137 if(reg54
< chtiming
[i
+5]) {
2138 SetPciConfig1(0x54 + offset
, chtiming
[i
+5]);
2143 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2144 ChangePciConfig1(0x50, a
| (1 << (dev
+ 3)) );
2145 GetPciConfig1(0x54 + offset
, reg54
);
2146 if(reg54
< chtiming
[apiomode
]) {
2147 SetPciConfig1(0x54 + offset
, chtiming
[apiomode
]);
2151 if(ChipType
== ITE_133_NEW
) {
2152 //static const USHORT reg54_timings[] = { 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x1001, 0x1001 };
2153 static const UCHAR udmatiming
[] =
2154 { 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10 };
2155 static const UCHAR timings
[] =
2156 { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23,
2157 0x23, 0x23, 0x23, 0x23, 0x23, 0x02, 0x02 };
2158 BOOLEAN udma_ok
= FALSE
;
2166 USHORT mask40
=0, new40
=0;
2167 UCHAR mask44
=0, new44
=0;
2169 GetPciConfig2(0x40, reg40
);
2170 GetPciConfig1(0x44, reg44
);
2171 GetPciConfig2(0x4a, reg4a
);
2172 GetPciConfig2(0x54, reg54
);
2174 if(!(reg54
& (0x10 << dev
))) {
2176 udmamode
= min(udmamode
, 2);
2179 for(i
=udmamode
; i
>=0; i
--) {
2180 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2181 ChangePciConfig1(0x48, a
| (1 << dev
) );
2182 ChangePciConfig2(0x4a,
2183 (a
& ~(0x3 << (dev
*4))) |
2184 (udmatiming
[i
] << (dev
*4)) );
2187 timing
= timings
[i
+8];
2192 for(i
=wdmamode
; !ok
&& i
>=0; i
--) {
2193 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2196 timing
= timings
[i
+5];
2202 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2203 timing
= timings
[apiomode
];
2207 ChangePciConfig1(0x48, a
& ~(1 << dev
) );
2208 ChangePciConfig2(0x4a, a
& ~(0x3 << (dev
<< 2)) );
2210 if (udma_ok
&& udmamode
>= ATA_UDMA2
) {
2211 reg54
|= (0x1 << dev
);
2213 reg54
&= ~(0x1 << dev
);
2215 if (udma_ok
&& udmamode
>= ATA_UDMA5
) {
2216 reg54
|= (0x1000 << dev
);
2218 reg54
&= ~(0x1000 << dev
);
2220 SetPciConfig2(0x54, reg54
);
2225 if(!(DeviceNumber
& 1)) {
2226 reg40
|= (isAtapi
? 0x04 : 0x00);
2228 new40
= timing
<< 8;
2230 reg40
|= (isAtapi
? 0x40 : 0x00);
2232 new44
= ((timing
& 0x30) >> 2) |
2235 SetPciConfig2(0x40, (reg40
& ~mask40
) | new40
);
2236 SetPciConfig1(0x44, (reg44
& ~mask44
) | new44
);
2243 /* HiNT Corp. VXPro II EIDE */
2244 if (wdmamode
>= 0 &&
2245 (AtapiReadPort1(chan
, IDX_BM_Status
) &
2246 (DeviceNumber
? BM_STATUS_DRIVE_1_DMA
: BM_STATUS_DRIVE_0_DMA
))) {
2247 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
);
2249 AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
);
2252 case ATA_JMICRON_ID
: {
2255 GetPciConfig1(0x40, reg40
);
2259 udmamode
= min(udmamode
, 2);
2261 /* Nothing to do to setup mode, the controller snoop SET_FEATURE cmd. */
2264 for(i
=udmamode
; i
>=0; i
--) {
2265 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_UDMA0
+ i
)) {
2269 for(i
=wdmamode
; i
>=0; i
--) {
2270 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_WDMA0
+ i
)) {
2274 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
2283 /* unknown controller chip */
2285 /* better not try generic DMA on ATAPI devices it almost never works */
2287 KdPrint2((PRINT_PREFIX
"ATAPI on unknown controller -> PIO\n"));
2292 /* if controller says its setup for DMA take the easy way out */
2293 /* the downside is we dont know what DMA mode we are in */
2294 if ((udmamode
>= 0 || /*wdmamode > 1*/ wdmamode
>= 0) &&
2295 /*deviceExtension->BaseIoAddressBM[lChannel]*/ (deviceExtension
->BusMaster
==DMA_MODE_BM
) &&
2296 (GetDmaStatus(deviceExtension
, lChannel
) &
2297 (!(DeviceNumber
& 1) ?
2298 BM_STATUS_DRIVE_0_DMA
: BM_STATUS_DRIVE_1_DMA
))) {
2299 // LunExt->TransferMode = ATA_DMA;
2301 KdPrint2((PRINT_PREFIX
"try DMA on unknown controller\n"));
2302 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
)) {
2308 /* well, we have no support for this, but try anyways */
2309 if ((wdmamode
>= 0 && apiomode
>= 4) && deviceExtension
->BaseIoAddressBM
[lChannel
]) {
2310 if(AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_DMA
/* + wdmamode*/)) {
2316 KdPrint2((PRINT_PREFIX
"try PIO%d on unknown controller\n", apiomode
));
2317 if(!AtaSetTransferMode(deviceExtension
, DeviceNumber
, lChannel
, LunExt
, ATA_PIO0
+ apiomode
)) {
2318 KdPrint2((PRINT_PREFIX
"fall to PIO on unknown controller\n"));
2319 LunExt
->TransferMode
= ATA_PIO
;
2322 } // end AtapiDmaInit()
2328 IN PHW_DEVICE_EXTENSION deviceExtension
,
2329 IN ULONG dev
, // physical device number (0-3)
2333 // ASSERT(dev/2 >= deviceExtension->Channel);
2334 // PHW_CHANNEL chan = &(deviceExtension->chan[dev/2-deviceExtension->Channel]);
2335 ULONG reg20
= 0x0000e132;
2336 ULONG reg24
= 0x00017771;
2338 if(mode
== ATA_PIO5
)
2342 case ATA_PIO0
: reg20
= 0x0000e132; break;
2343 case ATA_PIO1
: reg20
= 0x00018121; break;
2344 case ATA_PIO2
: reg20
= 0x00024020; break;
2345 case ATA_PIO3
: reg20
= 0x00032010; break;
2347 case ATA_PIO5
: reg20
= 0x00040010; break;
2348 case ATA_WDMA2
: reg24
= 0x00002020; break;
2349 case ATA_UDMA2
: reg24
= 0x00911030; break;
2351 AtapiWritePortEx4(NULL
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(dev
*8) + 0x20, reg20
);
2352 AtapiWritePortEx4(NULL
, (ULONGIO_PTR
)(&deviceExtension
->BaseIoAddressBM_0
),(dev
*8) + 0x24, reg24
);
2358 IN PHW_DEVICE_EXTENSION deviceExtension
,
2359 IN ULONG dev
, // physical device number (0-3)
2363 PVOID HwDeviceExtension
= (PVOID
)deviceExtension
;
2364 ULONG slotNumber
= deviceExtension
->slotNumber
;
2365 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
2367 //ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
2369 ULONG port
= 0x60 + (dev
<<2);
2371 if(mode
== ATA_PIO5
)
2378 // **** FreeBSD code ****
2380 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
2387 case ATA_PIO0
: timing
= 0x004ff329; break;
2388 case ATA_PIO1
: timing
= 0x004fec25; break;
2389 case ATA_PIO2
: timing
= 0x004fe823; break;
2390 case ATA_PIO3
: timing
= 0x004fe622; break;
2391 case ATA_PIO4
: timing
= 0x004fe421; break;
2392 case ATA_WDMA0
: timing
= 0x004567f3; break;
2393 case ATA_WDMA1
: timing
= 0x004467f3; break;
2394 case ATA_WDMA2
: timing
= 0x004367f3; break;
2395 case ATA_UDMA0
: timing
= 0x004367f3; break;
2396 case ATA_UDMA1
: timing
= 0x004247f3; break;
2397 case ATA_UDMA2
: timing
= 0x004127f3; break;
2404 case ATA_PIO0
: timing
= 0x004fff2f; break;
2405 case ATA_PIO1
: timing
= 0x004ff82a; break;
2406 case ATA_PIO2
: timing
= 0x004ff026; break;
2407 case ATA_PIO3
: timing
= 0x004fec24; break;
2408 case ATA_PIO4
: timing
= 0x004fe822; break;
2409 case ATA_WDMA0
: timing
= 0x004acef6; break;
2410 case ATA_WDMA1
: timing
= 0x0048cef6; break;
2411 case ATA_WDMA2
: timing
= 0x0046cef6; break;
2412 case ATA_UDMA0
: timing
= 0x0046cef6; break;
2413 case ATA_UDMA1
: timing
= 0x00448ef6; break;
2414 case ATA_UDMA2
: timing
= 0x00436ef6; break;
2415 case ATA_UDMA3
: timing
= 0x00424ef6; break;
2416 case ATA_UDMA4
: timing
= 0x004127f3; break;
2417 case ATA_UDMA5
: timing
= 0x004127f3; break;
2426 SetPciConfig4(port
, timing
);
2429 // **** Linux code ****
2431 UCHAR r_bp
, r_cp
, r_ap
;
2434 static UCHAR udma_timing
[6][2] = {
2435 { 0x60, 0x03 }, /* 33 Mhz Clock */
2438 { 0x40, 0x02 }, /* 66 Mhz Clock */
2442 static UCHAR mdma_timing
[3][2] = {
2447 static USHORT pio_timing
[5] = {
2448 0x0913, 0x050C , 0x0308, 0x0206, 0x0104
2451 if(mode
> ATA_UDMA5
) {
2455 if(mode
> ATA_WDMA0
) {
2457 GetPciConfig1(port
+1, r_bp
);
2458 GetPciConfig1(port
+2, r_cp
);
2463 if(mode
>= ATA_UDMA0
) {
2464 i
= mode
- ATA_UDMA0
;
2465 r_bp
|= udma_timing
[i
][0];
2466 r_cp
|= udma_timing
[i
][1];
2469 i
= mode
- ATA_WDMA0
;
2470 r_bp
|= mdma_timing
[i
][0];
2471 r_cp
|= mdma_timing
[i
][1];
2473 SetPciConfig1(port
+1, r_bp
);
2474 SetPciConfig1(port
+2, r_cp
);
2476 if(mode
<= ATA_PIO5
) {
2477 GetPciConfig1(port
+0, r_ap
);
2478 GetPciConfig1(port
+1, r_bp
);
2480 i
= mode
- ATA_PIO0
;
2481 r_ap
&= ~0x3F; /* Preserve ERRDY_EN, SYNC_IN */
2483 r_ap
|= (UCHAR
)(pio_timing
[i
] >> 8);
2484 r_bp
|= (UCHAR
)(pio_timing
[i
] & 0xFF);
2486 // if (ata_pio_need_iordy(adev))
2487 r_ap
|= 0x20; /* IORDY enable */
2488 // if (adev->class == ATA_DEV_ATA)
2489 // r_ap |= 0x10; /* FIFO enable */
2491 SetPciConfig1(port
+0, r_ap
);
2492 SetPciConfig1(port
+1, r_bp
);
2497 } // end promise_timing()
2503 IN PHW_DEVICE_EXTENSION deviceExtension
,
2504 IN ULONG dev
, // physical device number (0-3)
2508 PVOID HwDeviceExtension
= (PVOID
)deviceExtension
;
2509 ULONG slotNumber
= deviceExtension
->slotNumber
;
2510 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
2512 ULONG ChipType
= deviceExtension
->HwFlags
& CHIPTYPE_MASK
;
2513 //ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
2517 if(mode
== ATA_PIO5
)
2523 switch (mode
) { /* HPT374 */
2524 case ATA_PIO0
: timing
= 0x0ac1f48a; break;
2525 case ATA_PIO1
: timing
= 0x0ac1f465; break;
2526 case ATA_PIO2
: timing
= 0x0a81f454; break;
2527 case ATA_PIO3
: timing
= 0x0a81f443; break;
2528 case ATA_PIO4
: timing
= 0x0a81f442; break;
2529 case ATA_WDMA0
: timing
= 0x228082ea; break;
2530 case ATA_WDMA1
: timing
= 0x22808254; break;
2531 case ATA_WDMA2
: timing
= 0x22808242; break;
2532 case ATA_UDMA0
: timing
= 0x121882ea; break;
2533 case ATA_UDMA1
: timing
= 0x12148254; break;
2534 case ATA_UDMA2
: timing
= 0x120c8242; break;
2535 case ATA_UDMA3
: timing
= 0x128c8242; break;
2536 case ATA_UDMA4
: timing
= 0x12ac8242; break;
2537 case ATA_UDMA5
: timing
= 0x12848242; break;
2538 case ATA_UDMA6
: timing
= 0x12808242; break;
2539 default: timing
= 0x0d029d5e;
2545 switch (mode
) { /* HPT372 */
2546 case ATA_PIO0
: timing
= 0x0d029d5e; break;
2547 case ATA_PIO1
: timing
= 0x0d029d26; break;
2548 case ATA_PIO2
: timing
= 0x0c829ca6; break;
2549 case ATA_PIO3
: timing
= 0x0c829c84; break;
2550 case ATA_PIO4
: timing
= 0x0c829c62; break;
2551 case ATA_WDMA0
: timing
= 0x2c82922e; break;
2552 case ATA_WDMA1
: timing
= 0x2c829266; break;
2553 case ATA_WDMA2
: timing
= 0x2c829262; break;
2554 case ATA_UDMA0
: timing
= 0x1c829c62; break;
2555 case ATA_UDMA1
: timing
= 0x1c9a9c62; break;
2556 case ATA_UDMA2
: timing
= 0x1c929c62; break;
2557 case ATA_UDMA3
: timing
= 0x1c8e9c62; break;
2558 case ATA_UDMA4
: timing
= 0x1c8a9c62; break;
2559 case ATA_UDMA5
: timing
= 0x1c8a9c62; break;
2560 case ATA_UDMA6
: timing
= 0x1c869c62; break;
2561 default: timing
= 0x0d029d5e;
2567 switch (mode
) { /* HPT370 */
2568 case ATA_PIO0
: timing
= 0x06914e57; break;
2569 case ATA_PIO1
: timing
= 0x06914e43; break;
2570 case ATA_PIO2
: timing
= 0x06514e33; break;
2571 case ATA_PIO3
: timing
= 0x06514e22; break;
2572 case ATA_PIO4
: timing
= 0x06514e21; break;
2573 case ATA_WDMA0
: timing
= 0x26514e97; break;
2574 case ATA_WDMA1
: timing
= 0x26514e33; break;
2575 case ATA_WDMA2
: timing
= 0x26514e21; break;
2576 case ATA_UDMA0
: timing
= 0x16514e31; break;
2577 case ATA_UDMA1
: timing
= 0x164d4e31; break;
2578 case ATA_UDMA2
: timing
= 0x16494e31; break;
2579 case ATA_UDMA3
: timing
= 0x166d4e31; break;
2580 case ATA_UDMA4
: timing
= 0x16454e31; break;
2581 case ATA_UDMA5
: timing
= 0x16454e31; break;
2582 default: timing
= 0x06514e57;
2588 GetPciConfig1(0x41 + (dev
<< 2), reg41
);
2591 case 0x85: /* 25Mhz */
2593 case ATA_PIO0
: timing
= 0x40d08585; break;
2594 case ATA_PIO1
: timing
= 0x40d08572; break;
2595 case ATA_PIO2
: timing
= 0x40ca8542; break;
2596 case ATA_PIO3
: timing
= 0x40ca8532; break;
2597 case ATA_PIO4
: timing
= 0x40ca8521; break;
2598 case ATA_WDMA2
: timing
= 0x20ca8521; break;
2599 case ATA_UDMA2
: timing
= 0x10cf8521; break;
2600 case ATA_UDMA4
: timing
= 0x10c98521; break;
2601 default: timing
= 0x01208585;
2605 case 0xa7: /* 33MHz */
2607 case ATA_PIO0
: timing
= 0x40d0a7aa; break;
2608 case ATA_PIO1
: timing
= 0x40d0a7a3; break;
2609 case ATA_PIO2
: timing
= 0x40d0a753; break;
2610 case ATA_PIO3
: timing
= 0x40c8a742; break;
2611 case ATA_PIO4
: timing
= 0x40c8a731; break;
2612 case ATA_WDMA0
: timing
= 0x20c8a797; break;
2613 case ATA_WDMA1
: timing
= 0x20c8a732; break;
2614 case ATA_WDMA2
: timing
= 0x20c8a731; break;
2615 case ATA_UDMA0
: timing
= 0x10c8a731; break;
2616 case ATA_UDMA1
: timing
= 0x10cba731; break;
2617 case ATA_UDMA2
: timing
= 0x10caa731; break;
2618 case ATA_UDMA3
: timing
= 0x10cfa731; break;
2619 case ATA_UDMA4
: timing
= 0x10c9a731; break;
2620 default: timing
= 0x0120a7a7;
2623 case 0xd9: /* 40Mhz */
2625 case ATA_PIO0
: timing
= 0x4018d9d9; break;
2626 case ATA_PIO1
: timing
= 0x4010d9c7; break;
2627 case ATA_PIO2
: timing
= 0x4010d997; break;
2628 case ATA_PIO3
: timing
= 0x4010d974; break;
2629 case ATA_PIO4
: timing
= 0x4008d963; break;
2630 case ATA_WDMA2
: timing
= 0x2008d943; break;
2631 case ATA_UDMA2
: timing
= 0x100bd943; break;
2632 case ATA_UDMA4
: timing
= 0x100fd943; break;
2633 default: timing
= 0x0120d9d9;
2639 SetPciConfig4(0x40 + (dev
<<2), timing
);
2640 } // end hpt_timing()
2643 #define FIT(v,min,max) (((v)>(max)?(max):(v))<(min)?(min):(v))
2648 IN PHW_DEVICE_EXTENSION deviceExtension
,
2649 IN ULONG dev
, // physical device number (0-3)
2653 PVOID HwDeviceExtension
= (PVOID
)deviceExtension
;
2654 ULONG slotNumber
= deviceExtension
->slotNumber
;
2655 ULONG SystemIoBusNumber
= deviceExtension
->SystemIoBusNumber
;
2657 // Newer chips dislike this:
2658 if(/*!(deviceExtension->HwFlags & VIAAST)*/
2659 deviceExtension
->MaxTransferMode
< ATA_UDMA6
) {
2663 USHORT T
= 1000 / /* PciBusClockMHz()*/ 33;
2674 case ATA_PIO0
: setup
= 70; active
= 165; recover
= 150; cycle
= 600; break;
2675 case ATA_PIO1
: setup
= 50; active
= 125; recover
= 100; cycle
= 383; break;
2676 case ATA_PIO2
: setup
= 30; active
= 100; recover
= 90; cycle
= 240; break;
2677 case ATA_PIO3
: setup
= 30; active
= 80; recover
= 70; cycle
= 180; break;
2678 case ATA_PIO4
: setup
= 25; active
= 70; recover
= 25; cycle
= 120; break;
2679 case ATA_PIO5
: setup
= 20; active
= 50; recover
= 30; cycle
= 100; break;
2682 setup
= (setup
-1)/(T
+1);
2683 active
= (active
-1)/(T
+1);
2684 recover
= (recover
-1)/(T
+1);
2685 cycle
= (cycle
-1)/(T
+1);
2687 if (active
+ recover
< cycle
) {
2688 active
+= (cycle
- (active
+ recover
)) / 2;
2689 recover
= cycle
- active
;
2692 /* PIO address setup */
2693 GetPciConfig1(0x4c, t
);
2694 t
= (t
& ~(3 << ((3 - dev
) << 1))) | (FIT(setup
- 1, 0, 3) << ((3 - dev
) << 1));
2695 SetPciConfig1(0x4c, t
);
2697 /* PIO active & recover */
2698 SetPciConfig1(0x4b-dev
, (FIT(active
- 1, 0, 0xf) << 4) | FIT(recover
- 1, 0, 0xf) );
2699 } // end via82c_timing()