mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-01 17:10:11 +00:00
nvme: Fix error in nvme_setup_prps
Consulting to "NVM Express® Base Specification, revision 2.0". If more PRP List pages are required, then the last entry of the PRP List contains the Page Base Address of the next PRP List page. The next PRP List page shall be memory page aligned. Signed-off-by: Jon Lin <jon.lin@rock-chips.com> Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
This commit is contained in:
parent
b6bfb8971d
commit
c4eef59faa
1 changed files with 5 additions and 4 deletions
|
@ -100,7 +100,7 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
|
|||
}
|
||||
|
||||
nprps = DIV_ROUND_UP(length, page_size);
|
||||
num_pages = DIV_ROUND_UP(nprps, prps_per_page);
|
||||
num_pages = DIV_ROUND_UP(nprps + 1, prps_per_page);
|
||||
|
||||
if (nprps > dev->prp_entry_num) {
|
||||
free(dev->prp_pool);
|
||||
|
@ -119,10 +119,11 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
|
|||
prp_pool = dev->prp_pool;
|
||||
i = 0;
|
||||
while (nprps) {
|
||||
if (i == ((page_size >> 3) - 1)) {
|
||||
*(prp_pool + i) = cpu_to_le64((ulong)prp_pool +
|
||||
if (i == prps_per_page) {
|
||||
*(prp_pool + i) = *(prp_pool + i - 1);
|
||||
*(prp_pool + i - 1) = cpu_to_le64((ulong)prp_pool +
|
||||
page_size);
|
||||
i = 0;
|
||||
i = 1;
|
||||
prp_pool += page_size;
|
||||
}
|
||||
*(prp_pool + i++) = cpu_to_le64(dma_addr);
|
||||
|
|
Loading…
Reference in a new issue