}
 
                if (vnic->rss_table) {
-                       dma_free_coherent(&pdev->dev, PAGE_SIZE,
+                       dma_free_coherent(&pdev->dev, vnic->rss_table_size,
                                          vnic->rss_table,
                                          vnic->rss_table_dma_addr);
                        vnic->rss_table = NULL;
                        continue;
 
                /* Allocate rss table and hash key */
-               vnic->rss_table = dma_alloc_coherent(&pdev->dev, PAGE_SIZE,
+               size = L1_CACHE_ALIGN(HW_HASH_INDEX_SIZE * sizeof(u16));
+               if (bp->flags & BNXT_FLAG_CHIP_P5)
+                       size = L1_CACHE_ALIGN(BNXT_MAX_RSS_TABLE_SIZE_P5);
+
+               vnic->rss_table_size = size + HW_HASH_KEY_SIZE;
+               vnic->rss_table = dma_alloc_coherent(&pdev->dev,
+                                                    vnic->rss_table_size,
                                                     &vnic->rss_table_dma_addr,
                                                     GFP_KERNEL);
                if (!vnic->rss_table) {
                        goto out;
                }
 
-               size = L1_CACHE_ALIGN(HW_HASH_INDEX_SIZE * sizeof(u16));
-
                vnic->rss_hash_key = ((void *)vnic->rss_table) + size;
                vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr + size;
        }
 
        __le16          *rss_table;
        dma_addr_t      rss_hash_key_dma_addr;
        u64             *rss_hash_key;
+       int             rss_table_size;
+#define BNXT_RSS_TABLE_ENTRIES_P5      64
+#define BNXT_RSS_TABLE_SIZE_P5         (BNXT_RSS_TABLE_ENTRIES_P5 * 4)
+#define BNXT_RSS_TABLE_MAX_TBL_P5      8
+#define BNXT_MAX_RSS_TABLE_SIZE_P5                             \
+       (BNXT_RSS_TABLE_SIZE_P5 * BNXT_RSS_TABLE_MAX_TBL_P5)
+
        u32             rx_mask;
 
        u8              *mc_list;