From a693301a4cc63fdd10a024c4eaf4b498b4c36737 Mon Sep 17 00:00:00 2001 From: Abdur-Rahman Mansoor Date: Tue, 4 Jun 2024 16:12:19 -0400 Subject: [PATCH] fix: set SQ_ENTRY.CDW0 to valid value in commands --- drivers/nvme/nvme.asm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/nvme.asm b/drivers/nvme/nvme.asm index 676608a..9dfa802 100644 --- a/drivers/nvme/nvme.asm +++ b/drivers/nvme/nvme.asm @@ -152,6 +152,8 @@ proc create_io_completion_queue stdcall, pci:dword, prp1:dword, qid:word, ien:by or ebx, eax ; CDW.PC mov esi, [esi + pcidev.sq_ptr] stdcall memset, esi, 0, sizeof.SQ_ENTRY + stdcall set_cdw0, ADM_CMD_CRE_IO_COMPLETION_QUEUE, 0 ; [TODO: Set CID to valid value] + mov dword [esi + SQ_ENTRY.cdw0], eax ; Since we are not using MSI-X or MSI vector (yet), CDW11.IV must be set to 0 mov dword [esi + SQ_ENTRY.cdw11], ebx mov bx, [qid] ; CDW10.QID @@ -176,6 +178,8 @@ proc create_io_submission_queue stdcall, pci:dword, prp1:dword, qid:word, cqid:w and ebx, 0x1 ; CDW11.PC mov esi, [esi + pcidev.sq_ptr] stdcall memset, esi, 0, sizeof.SQ_ENTRY + stdcall set_cdw0, ADM_CMD_CRE_IO_SUBMISSION_QUEUE, 0 ; [TODO: Set CID to valid value] + mov dword [esi + SQ_ENTRY.cdw0], eax movzx eax, [cqid] shl eax, 16 or ebx, eax ; CDW11.CQID @@ -201,6 +205,8 @@ proc delete_io_completion_queue stdcall, pci:dword, qid:word mov esi, [pci] mov esi, [esi + pcidev.sq_ptr] stdcall memset, esi, 0, sizeof.SQ_ENTRY + stdcall set_cdw0, ADM_CMD_DEL_IO_COMPLETION_QUEUE, 0 ; [TODO: Set CID to valid value] + mov dword [esi + SQ_ENTRY.cdw0], eax mov ax, [qid] mov word [esi + SQ_ENTRY.cdw10], ax stdcall sqytdbl_write, [pci], [qid], 0 ; setting last param to 0 for now, change later @@ -215,7 +221,8 @@ proc get_features stdcall, pci:dword, dptr:dword, sel:byte, fid:byte mov esi, [pci] mov esi, [esi + pcidev.sq_ptr] stdcall memset, esi, 0, sizeof.SQ_ENTRY - mov + stdcall set_cdw0, ADM_CMD_GET_FEATURES, 0 ; [TODO: Set CID to valid value] + mov dword [esi + SQ_ENTRY.cdw0], eax movzx eax, [fid] ; CDW10.FID movzx ebx, [sel] and ebx, 111b @@ -238,6 +245,8 @@ proc delete_io_submission_queue stdcall, pci:dword, qid:word mov esi, [pci] mov esi, [esi + pcidev.sq_ptr] stdcall memset, esi, 0, sizeof.SQ_ENTRY + stdcall set_cdw0, ADM_CMD_DEL_IO_SUBMISSION_QUEUE, 0 ; [TODO: Set CID to valid value] + mov dword [esi + SQ_ENTRY.cdw0], eax mov ax, [qid] mov word [esi + SQ_ENTRY.cdw10], ax stdcall sqytdbl_write, [pci], [qid], 0 ; setting last param to 0 for now, change later