1) Fix - sectors read with errors now are not brought in the cache.
2) Timeout at absence of the disk in ATAPI drive is reduced about 10 seconds without lowering reliability of reading at presence of the disk. Earlier time the waiting could make 1-1.5 minutes.


git-svn-id: svn://kolibrios.org@628 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Marat Zakiyanov (Mario79) 2007-09-16 20:06:19 +00:00
parent f53429e2f8
commit 66417e61bd
2 changed files with 57 additions and 49 deletions

View File

@ -34,29 +34,28 @@ NoTickWaitTime equ 0xfffff
ReadCD: ReadCD:
pusha pusha
; Задать размер сектора ; Задать размер сектора
mov [CDBlockSize],2048 ;2352 mov [CDBlockSize],2048 ;2352
; Очистить буфер пакетной команды ; Очистить буфер пакетной команды
call clear_packet_buffer call clear_packet_buffer
; Сформировать пакетную команду для считывания ; Сформировать пакетную команду для считывания
; сектора данных ; сектора данных
; Задать код команды Read CD ; Задать код команды Read CD
mov [PacketCommand],byte 0x28 ;0xBE mov [PacketCommand],byte 0x28 ;0xBE
; Задать адрес сектора ; Задать адрес сектора
mov AX,word [CDSectorAddress+2] mov AX,word [CDSectorAddress+2]
xchg AL,AH xchg AL,AH
mov word [PacketCommand+2],AX mov word [PacketCommand+2],AX
mov AX,word [CDSectorAddress] mov AX,word [CDSectorAddress]
xchg AL,AH xchg AL,AH
mov word [PacketCommand+4],AX mov word [PacketCommand+4],AX
; mov eax,[CDSectorAddress] ; mov eax,[CDSectorAddress]
; mov [PacketCommand+2],eax ; mov [PacketCommand+2],eax
; Задать количество считываемых секторов ; Задать количество считываемых секторов
mov [PacketCommand+8],byte 1 mov [PacketCommand+8],byte 1
; Задать считывание данных в полном объеме ; Задать считывание данных в полном объеме
; mov [PacketCommand+9],byte 0xF8 ; mov [PacketCommand+9],byte 0xF8
; Подать команду ; Подать команду
call SendPacketDatCommand call SendPacketDatCommand
; call test_mario79
popa popa
ret ret
@ -97,6 +96,9 @@ ReadCDWRetr:
pop edi pop edi
call ReadCDWRetr_1 call ReadCDWRetr_1
cmp [DevErrorCode],0
jne .exit
mov [CDDataBuf_pointer],ebx mov [CDDataBuf_pointer],ebx
call cd_calculate_cache_1 call cd_calculate_cache_1
lea esi,[edi*8+esi] lea esi,[edi*8+esi]
@ -113,6 +115,7 @@ ReadCDWRetr:
mov ecx,512 ;/4 mov ecx,512 ;/4
cld cld
rep movsd ; move data rep movsd ; move data
.exit:
popad popad
ret ret
@ -121,34 +124,34 @@ ReadCDWRetr_1:
; Цикл, пока команда не выполнена успешно или не ; Цикл, пока команда не выполнена успешно или не
; исчерпано количество попыток ; исчерпано количество попыток
mov ECX,MaxRetr mov ECX,MaxRetr
@@NextRetr: @@NextRetr:
; Подать команду ; Подать команду
call ReadCD call ReadCD
cmp [DevErrorCode],0 cmp [DevErrorCode],0
je @@End_4 je @@End_4
or ecx,ecx ;{SPraid.simba} (for cd load) or ecx,ecx ;{SPraid.simba} (for cd load)
jz @@End_4 jz @@End_4
dec ecx dec ecx
cmp [timer_ticks_enable],0 cmp [timer_ticks_enable],0
jne @f jne @f
mov eax,NoTickWaitTime mov eax,NoTickWaitTime
.wait: .wait:
dec eax dec eax
cmp eax,0 cmp eax,0
je @@NextRetr je @@NextRetr
jmp .wait jmp .wait
@@: @@:
; Задержка на 2,5 секунды ; Задержка на 2,5 секунды
mov EAX,[timer_ticks] ; mov EAX,[timer_ticks]
add EAX,250 ;50 ; add EAX,50 ;250
@@Wait: ;@@Wait:
call change_task ; call change_task
cmp EAX,[timer_ticks] ; cmp EAX,[timer_ticks]
ja @@Wait ; ja @@Wait
loop @@NextRetr loop @@NextRetr
@@End_4: @@End_4:
popad popad
ret ret
@ -189,6 +192,7 @@ CDDataBuf_pointer dd 0
;**************************************************** ;****************************************************
SendPacketDatCommand: SendPacketDatCommand:
pushad pushad
mov [DevErrorCode],0
; Задать режим CHS ; Задать режим CHS
mov [ATAAddressMode],0 mov [ATAAddressMode],0
; Послать ATA-команду передачи пакетной команды ; Послать ATA-команду передачи пакетной команды
@ -301,7 +305,6 @@ SendPacketDatCommand:
jmp @@End_8 jmp @@End_8
@@Err6: @@Err6:
mov [DevErrorCode],6 mov [DevErrorCode],6
@@End_8: @@End_8:
popad popad
ret ret
@ -319,6 +322,7 @@ SendPacketDatCommand:
;*********************************************** ;***********************************************
SendPacketNoDatCommand: SendPacketNoDatCommand:
pushad pushad
mov [DevErrorCode],0
; Задать режим CHS ; Задать режим CHS
mov [ATAAddressMode],0 mov [ATAAddressMode],0
; Послать ATA-команду передачи пакетной команды ; Послать ATA-команду передачи пакетной команды
@ -367,7 +371,7 @@ SendPacketNoDatCommand:
out DX,AX out DX,AX
; sti ; sti
cmp [ignore_CD_eject_wait],1 cmp [ignore_CD_eject_wait],1
je @@End_9 je @@End_9
; Ожидание подтверждения приема команды ; Ожидание подтверждения приема команды
mov DX,[ATABasePortAddr] mov DX,[ATABasePortAddr]
add DX,7 ;порт 1х7h add DX,7 ;порт 1х7h
@ -419,6 +423,7 @@ SendPacketNoDatCommand:
;**************************************************** ;****************************************************
SendCommandToHDD_1: SendCommandToHDD_1:
pushad pushad
mov [DevErrorCode],0
; Проверить значение кода режима ; Проверить значение кода режима
cmp [ATAAddressMode],1 cmp [ATAAddressMode],1
ja @@Err2_4 ja @@Err2_4
@ -815,21 +820,19 @@ ignore_CD_eject_wait db 0
;************************************************* ;*************************************************
GetEvent_StatusNotification: GetEvent_StatusNotification:
pusha pusha
mov [CDDataBuf_pointer],CDDataBuf mov [CDDataBuf_pointer],CDDataBuf
; Очистить буфер пакетной команды ; Очистить буфер пакетной команды
call clear_packet_buffer call clear_packet_buffer
; Задать код команды ; Задать код команды
mov [PacketCommand],word 4Ah mov [PacketCommand],byte 4Ah
mov [PacketCommand+1],byte 00000001b mov [PacketCommand+1],byte 00000001b
; Задать запрос класса сообщений ; Задать запрос класса сообщений
mov [PacketCommand+4],byte 00010000b mov [PacketCommand+4],byte 00010000b
; Çàäàòü çàïðîñ êëàññà ñîîáùåíèé ; Ðàçìåð âûäåëåííîé îáëàñòè
mov [PacketCommand+7],byte 8 mov [PacketCommand+7],byte 8h
mov [PacketCommand+8],byte 0 mov [PacketCommand+8],byte 0h
; Подать команду ; Подать команду
; mov [timer_ticks_enable],0
call SendPacketDatCommand call SendPacketDatCommand
; mov [timer_ticks_enable],1
popa popa
ret ret
@ -841,17 +844,17 @@ GetEvent_StatusNotification:
;* DiskNumber - номер диска на канале. * ;* DiskNumber - номер диска на канале. *
;************************************************* ;*************************************************
;ReadCapacity: ;ReadCapacity:
; pusha ; pusha
;; Очистить буфер пакетной команды ;; Очистить буфер пакетной команды
; call clear_packet_buffer ; call clear_packet_buffer
;; Задать размер буфера в байтах ;; Задать размер буфера в байтах
; mov [CDBlockSize],8 ; mov [CDBlockSize],8
;; Сформировать команду READ CAPACITY ;; Сформировать команду READ CAPACITY
; mov [PacketCommand],word 25h ; mov [PacketCommand],word 25h
;; Подать команду ;; Подать команду
; call SendPacketDatCommand ; call SendPacketDatCommand
; popa ; popa
; ret ; ret
clear_packet_buffer: clear_packet_buffer:
; Очистить буфер пакетной команды ; Очистить буфер пакетной команды
@ -859,4 +862,3 @@ clear_packet_buffer:
mov [PacketCommand+4],dword 0 mov [PacketCommand+4],dword 0
mov [PacketCommand+8],dword 0 mov [PacketCommand+8],dword 0
ret ret

View File

@ -492,6 +492,7 @@ fs_CdGetFileInfo:
xor eax, eax xor eax, eax
ret ret
;----------------------------------------------------------------
cd_find_lfn: cd_find_lfn:
mov [cd_appl_data],0 mov [cd_appl_data],0
; in: esi+ebp -> name ; in: esi+ebp -> name
@ -501,6 +502,11 @@ cd_find_lfn:
; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ ; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ
mov [CDSectorAddress],dword 15 mov [CDSectorAddress],dword 15
mov [CDDataBuf_pointer],CDDataBuf mov [CDDataBuf_pointer],CDDataBuf
call WaitUnitReady
cmp [DevErrorCode],0
jne .access_denied
call prevent_medium_removal call prevent_medium_removal
.start: .start:
inc dword [CDSectorAddress] inc dword [CDSectorAddress]