forked from KolibriOS/kolibrios
kolibri-ahci:
- added write, seems to work git-svn-id: svn://kolibrios.org@9166 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
109befa1e4
commit
f270456bab
@ -328,7 +328,7 @@ ahci_callbacks:
|
|||||||
dd 0 ; no closemedia function
|
dd 0 ; no closemedia function
|
||||||
dd ahci_querymedia
|
dd ahci_querymedia
|
||||||
dd ahci_read
|
dd ahci_read
|
||||||
dd 0;ahci_write
|
dd ahci_write
|
||||||
dd 0 ; no flush function
|
dd 0 ; no flush function
|
||||||
dd 0 ; use default cache size
|
dd 0 ; use default cache size
|
||||||
.end:
|
.end:
|
||||||
@ -981,7 +981,7 @@ proc ahci_rw_sectors stdcall pdata: dword, vbuf: dword, startsector: qword, nums
|
|||||||
|
|
||||||
DEBUGF AHCI_DBGLVL, "sata_error register = 0x%x\n", [edi + HBA_PORT.sata_error]
|
DEBUGF AHCI_DBGLVL, "sata_error register = 0x%x\n", [edi + HBA_PORT.sata_error]
|
||||||
|
|
||||||
DEBUGF AHCI_DBGLVL, "reading completed\n"
|
DEBUGF AHCI_DBGLVL, "R/W completed\n"
|
||||||
|
|
||||||
; xor ecx, ecx
|
; xor ecx, ecx
|
||||||
; mov esi, [vbuf_orig]
|
; mov esi, [vbuf_orig]
|
||||||
@ -1068,6 +1068,52 @@ proc ahci_read stdcall pdata: dword, buffer: dword, startsector: qword, numsecto
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
; Write sectors
|
||||||
|
; return value: 0 = success, otherwise = error
|
||||||
|
proc ahci_write stdcall pdata: dword, buffer: dword, startsector: qword, numsectors_ptr:dword
|
||||||
|
locals
|
||||||
|
numsectors dd ?
|
||||||
|
endl
|
||||||
|
|
||||||
|
pushad
|
||||||
|
|
||||||
|
mov ecx, ahci_mutex
|
||||||
|
call mutex_lock
|
||||||
|
|
||||||
|
mov eax, [numsectors_ptr]
|
||||||
|
mov eax, [eax]
|
||||||
|
mov [numsectors], eax
|
||||||
|
DEBUGF AHCI_DBGLVL, " ahci_write: buffer = 0x%x, startsector = 0x%x:%x, numsectors = %u\n", [buffer], [startsector], [startsector + 4], eax
|
||||||
|
|
||||||
|
xor ecx, ecx ; how many sectors have been read
|
||||||
|
.write_loop:
|
||||||
|
cmp ecx, [numsectors]
|
||||||
|
jae .write_loop_end
|
||||||
|
|
||||||
|
mov ebx, [numsectors]
|
||||||
|
sub ebx, ecx
|
||||||
|
stdcall ahci_rw_sectors, [pdata], [buffer], dword [startsector], dword [startsector + 4], ebx, 1
|
||||||
|
;; TODO check if eax == 0 ?
|
||||||
|
|
||||||
|
DEBUGF AHCI_DBGLVL, " EAX = 0x%x\n", eax
|
||||||
|
|
||||||
|
add [buffer], eax
|
||||||
|
shr eax, 9 ; /= 512
|
||||||
|
add ecx, eax
|
||||||
|
add dword [startsector], eax
|
||||||
|
adc dword [startsector + 4], 0
|
||||||
|
|
||||||
|
jmp .write_loop
|
||||||
|
.write_loop_end:
|
||||||
|
|
||||||
|
mov ecx, ahci_mutex
|
||||||
|
call mutex_unlock
|
||||||
|
|
||||||
|
popad
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
; Start command engine
|
; Start command engine
|
||||||
; in: eax - address of HBA_PORT structure
|
; in: eax - address of HBA_PORT structure
|
||||||
ahci_start_cmd:
|
ahci_start_cmd:
|
||||||
|
Loading…
Reference in New Issue
Block a user