Merge branch 'master' into next
[platform/kernel/u-boot.git] / drivers / nvme / nvme.c
index 5fd2fb9..6d0d3f3 100644 (file)
@@ -71,7 +71,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 - 1);
 
        if (nprps > dev->prp_entry_num) {
                free(dev->prp_pool);
@@ -84,13 +84,13 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
                        printf("Error: malloc prp_pool fail\n");
                        return -ENOMEM;
                }
-               dev->prp_entry_num = prps_per_page * num_pages;
+               dev->prp_entry_num = num_pages * (prps_per_page - 1) + 1;
        }
 
        prp_pool = dev->prp_pool;
        i = 0;
        while (nprps) {
-               if (i == ((page_size >> 3) - 1)) {
+               if ((i == (prps_per_page - 1)) && nprps > 1) {
                        *(prp_pool + i) = cpu_to_le64((ulong)prp_pool +
                                        page_size);
                        i = 0;
@@ -103,7 +103,7 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
        *prp2 = (ulong)dev->prp_pool;
 
        flush_dcache_range((ulong)dev->prp_pool, (ulong)dev->prp_pool +
-                          dev->prp_entry_num * sizeof(u64));
+                          num_pages * page_size);
 
        return 0;
 }
@@ -888,7 +888,7 @@ int nvme_init(struct udevice *udev)
                sprintf(name, "blk#%d", i);
 
                /* The real blksz and size will be set by nvme_blk_probe() */
-               ret = blk_create_devicef(udev, "nvme-blk", name, IF_TYPE_NVME,
+               ret = blk_create_devicef(udev, "nvme-blk", name, UCLASS_NVME,
                                         -1, 512, 0, &ns_udev);
                if (ret)
                        goto free_id;