static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)
 {
        struct pci_dev *pdev = bp->pdev;
+       u64 valid_bit = 0;
        int i;
 
+       if (rmem->flags & (BNXT_RMEM_VALID_PTE_FLAG | BNXT_RMEM_RING_PTE_FLAG))
+               valid_bit = PTU_PTE_VALID;
        if (rmem->nr_pages > 1) {
                rmem->pg_tbl = dma_alloc_coherent(&pdev->dev,
                                                  rmem->nr_pages * 8,
        }
 
        for (i = 0; i < rmem->nr_pages; i++) {
+               u64 extra_bits = valid_bit;
+
                rmem->pg_arr[i] = dma_alloc_coherent(&pdev->dev,
                                                     rmem->page_size,
                                                     &rmem->dma_arr[i],
                if (!rmem->pg_arr[i])
                        return -ENOMEM;
 
-               if (rmem->nr_pages > 1)
-                       rmem->pg_tbl[i] = cpu_to_le64(rmem->dma_arr[i]);
+               if (rmem->nr_pages > 1) {
+                       if (i == rmem->nr_pages - 2 &&
+                           (rmem->flags & BNXT_RMEM_RING_PTE_FLAG))
+                               extra_bits |= PTU_PTE_NEXT_TO_LAST;
+                       else if (i == rmem->nr_pages - 1 &&
+                                (rmem->flags & BNXT_RMEM_RING_PTE_FLAG))
+                               extra_bits |= PTU_PTE_LAST;
+                       rmem->pg_tbl[i] =
+                               cpu_to_le64(rmem->dma_arr[i] | extra_bits);
+               }
        }
 
        if (rmem->vmem_size) {
 
 struct bnxt_ring_mem_info {
        int                     nr_pages;
        int                     page_size;
+       u32                     flags;
+#define BNXT_RMEM_VALID_PTE_FLAG       1
+#define BNXT_RMEM_RING_PTE_FLAG                2
+
        void                    **pg_arr;
        dma_addr_t              *dma_arr;
 
        struct bnxt_vf_rep_stats        tx_stats;
 };
 
+#define PTU_PTE_VALID             0x1UL
+#define PTU_PTE_LAST              0x2UL
+#define PTU_PTE_NEXT_TO_LAST      0x4UL
+
 struct bnxt {
        void __iomem            *bar0;
        void __iomem            *bar1;