diff --git a/drivers/nvme/nvme.asm b/drivers/nvme/nvme.asm index a897b2c..100e29f 100644 --- a/drivers/nvme/nvme.asm +++ b/drivers/nvme/nvme.asm @@ -140,7 +140,7 @@ proc nvme_identify stdcall, pci:dword, nsid:dword, dptr:dword, cns:byte mov dword [esp + SQ_ENTRY.cdw0], eax mov al, [cns] mov byte [esp + SQ_ENTRY.cdw10], al - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -179,7 +179,7 @@ proc create_io_completion_queue stdcall, pci:dword, prp1:dword, qid:dword, ien:b or eax, 0x1 ; CDW11.PC ; Don't set CDW11.IV since we're not using MSI-X or MSI vector mov dword [esp + SQ_ENTRY.cdw11], eax - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -202,7 +202,7 @@ proc create_io_submission_queue stdcall, pci:dword, prp1:dword, qid:dword, cqid: or eax, 0x1 ; CDW11.PC (always set this to 1 as some devices may not support non-contiguous pages) ; TODO: Set CDW10.QPRIO mov dword [esp + SQ_ENTRY.cdw11], eax - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -219,7 +219,7 @@ proc abort stdcall, pci:dword, cid:word, sqid:word shl eax, 16 or eax, word [sqid] mov dword [esp + SQ_ENTRY.cdw10], eax - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -240,7 +240,7 @@ proc set_features stdcall, pci:dword, dptr:dword, fid:byte, cdw11:dword mov dword [esp + SQ_ENTRY.cdw10], eax mov eax, [cdw11] mov dword [esp + SQ_ENTRY.cdw11], eax - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -255,7 +255,7 @@ proc delete_io_completion_queue stdcall, pci:dword, qid:word mov dword [esp + SQ_ENTRY.cdw0], eax mov ax, [qid] mov word [esp + SQ_ENTRY.cdw10], ax - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -276,7 +276,7 @@ proc get_features stdcall, pci:dword, dptr:dword, sel:byte, fid:byte mov eax, [dptr] mov dword [esp + SQ_ENTRY.dptr], eax ; TODO: Implement CDW14.UUID? - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -291,7 +291,7 @@ proc delete_io_submission_queue stdcall, pci:dword, qid:word mov dword [esp + SQ_ENTRY.cdw0], eax mov ax, [qid] mov word [esp + SQ_ENTRY.cdw10], ax - stdcall write_admin_cmd, [pci], esp + stdcall sqytdbl_write, [pci], ADMIN_QUEUE, esp add esp, sizeof.SQ_ENTRY ret @@ -767,12 +767,14 @@ proc sqytdbl_write stdcall, pci:dword, y:word, cmd:dword push ebx esi edi mov edi, [pci] + mov edi, dword [edi + pcidev.queue_entries] + movzx ecx, [y] + imul ecx, sizeof.NVM_QUEUE_ENTRY + mov edi, dword [edi + ecx + NVM_QUEUE_ENTRY.sq_ptr] mov esi, [cmd] mov ecx, dword [esi + SQ_ENTRY.cdw0] shr ecx, 16 ; Get CID imul ecx, sizeof.SQ_ENTRY - mov edi, dword [edi + pcidev.queue_entries] - mov edi, dword [edi + NVM_QUEUE_ENTRY.sq_ptr] lea edi, [edi + ecx] stdcall memcpy, edi, esi, sizeof.SQ_ENTRY