*   Get the len of the regs dump
  * get_rss_key_size()
  *   Get rss key size
- * get_rss_indir_size()
- *   Get rss indirection table size
  * get_rss()
  *   Get rss table
  * set_rss()
        int (*get_regs_len)(struct hnae3_handle *handle);
 
        u32 (*get_rss_key_size)(struct hnae3_handle *handle);
-       u32 (*get_rss_indir_size)(struct hnae3_handle *handle);
        int (*get_rss)(struct hnae3_handle *handle, u32 *indir, u8 *key,
                       u8 *hfunc);
        int (*set_rss)(struct hnae3_handle *handle, const u32 *indir,
 
 static u32 hns3_get_rss_indir_size(struct net_device *netdev)
 {
        struct hnae3_handle *h = hns3_get_handle(netdev);
+       struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
 
-       if (!h->ae_algo->ops->get_rss_indir_size)
-               return 0;
-
-       return h->ae_algo->ops->get_rss_indir_size(h);
+       return ae_dev->dev_specs.rss_ind_tbl_size;
 }
 
 static int hns3_get_rss(struct net_device *netdev, u32 *indir, u8 *key,
 
        return HCLGE_RSS_KEY_SIZE;
 }
 
-static u32 hclge_get_rss_indir_size(struct hnae3_handle *handle)
-{
-       return HCLGE_RSS_IND_TBL_SIZE;
-}
-
 static int hclge_set_rss_algo_key(struct hclge_dev *hdev,
                                  const u8 hfunc, const u8 *key)
 {
 {
        struct hclge_rss_indirection_table_cmd *req;
        struct hclge_desc desc;
+       int rss_cfg_tbl_num;
        u8 rss_msb_oft;
        u8 rss_msb_val;
        int ret;
        u32 j;
 
        req = (struct hclge_rss_indirection_table_cmd *)desc.data;
+       rss_cfg_tbl_num = hdev->ae_dev->dev_specs.rss_ind_tbl_size /
+                         HCLGE_RSS_CFG_TBL_SIZE;
 
-       for (i = 0; i < HCLGE_RSS_CFG_TBL_NUM; i++) {
+       for (i = 0; i < rss_cfg_tbl_num; i++) {
                hclge_cmd_setup_basic_desc
                        (&desc, HCLGE_OPC_RSS_INDIR_TABLE, false);
 
 static int hclge_get_rss(struct hnae3_handle *handle, u32 *indir,
                         u8 *key, u8 *hfunc)
 {
+       struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
        struct hclge_vport *vport = hclge_get_vport(handle);
        int i;
 
 
        /* Get indirect table */
        if (indir)
-               for (i = 0; i < HCLGE_RSS_IND_TBL_SIZE; i++)
+               for (i = 0; i < ae_dev->dev_specs.rss_ind_tbl_size; i++)
                        indir[i] =  vport->rss_indirection_tbl[i];
 
        return 0;
 static int hclge_set_rss(struct hnae3_handle *handle, const u32 *indir,
                         const  u8 *key, const  u8 hfunc)
 {
+       struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
        u8 hash_algo;
        }
 
        /* Update the shadow RSS table with user specified qids */
-       for (i = 0; i < HCLGE_RSS_IND_TBL_SIZE; i++)
+       for (i = 0; i < ae_dev->dev_specs.rss_ind_tbl_size; i++)
                vport->rss_indirection_tbl[i] = indir[i];
 
        /* Update the hardware */
        int i, j;
 
        for (j = 0; j < hdev->num_vmdq_vport + 1; j++) {
-               for (i = 0; i < HCLGE_RSS_IND_TBL_SIZE; i++)
+               for (i = 0; i < hdev->ae_dev->dev_specs.rss_ind_tbl_size; i++)
                        vport[j].rss_indirection_tbl[i] =
                                i % vport[j].alloc_rss_size;
        }
 }
 
-static void hclge_rss_init_cfg(struct hclge_dev *hdev)
+static int hclge_rss_init_cfg(struct hclge_dev *hdev)
 {
+       u16 rss_ind_tbl_size = hdev->ae_dev->dev_specs.rss_ind_tbl_size;
        int i, rss_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
        struct hclge_vport *vport = hdev->vport;
 
                rss_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
 
        for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
+               u16 *rss_ind_tbl;
+
                vport[i].rss_tuple_sets.ipv4_tcp_en =
                        HCLGE_RSS_INPUT_TUPLE_OTHER;
                vport[i].rss_tuple_sets.ipv4_udp_en =
 
                vport[i].rss_algo = rss_algo;
 
+               rss_ind_tbl = devm_kcalloc(&hdev->pdev->dev, rss_ind_tbl_size,
+                                          sizeof(*rss_ind_tbl), GFP_KERNEL);
+               if (!rss_ind_tbl)
+                       return -ENOMEM;
+
+               vport[i].rss_indirection_tbl = rss_ind_tbl;
                memcpy(vport[i].rss_hash_key, hclge_hash_key,
                       HCLGE_RSS_KEY_SIZE);
        }
 
        hclge_rss_indir_init_cfg(hdev);
+
+       return 0;
 }
 
 int hclge_bind_ring_with_vector(struct hclge_vport *vport,
                goto err_mdiobus_unreg;
        }
 
-       hclge_rss_init_cfg(hdev);
+       ret = hclge_rss_init_cfg(hdev);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to init rss cfg, ret = %d\n", ret);
+               goto err_mdiobus_unreg;
+       }
+
        ret = hclge_rss_init_hw(hdev);
        if (ret) {
                dev_err(&pdev->dev, "Rss init fail, ret =%d\n", ret);
 static int hclge_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
                              bool rxfh_configured)
 {
+       struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
        u16 tc_offset[HCLGE_MAX_TC_NUM] = {0};
                goto out;
 
        /* Reinitializes the rss indirect table according to the new RSS size */
-       rss_indir = kcalloc(HCLGE_RSS_IND_TBL_SIZE, sizeof(u32), GFP_KERNEL);
+       rss_indir = kcalloc(ae_dev->dev_specs.rss_ind_tbl_size, sizeof(u32),
+                           GFP_KERNEL);
        if (!rss_indir)
                return -ENOMEM;
 
-       for (i = 0; i < HCLGE_RSS_IND_TBL_SIZE; i++)
+       for (i = 0; i < ae_dev->dev_specs.rss_ind_tbl_size; i++)
                rss_indir[i] = i % kinfo->rss_size;
 
        ret = hclge_set_rss(handle, rss_indir, NULL, 0);
        .get_fec = hclge_get_fec,
        .set_fec = hclge_set_fec,
        .get_rss_key_size = hclge_get_rss_key_size,
-       .get_rss_indir_size = hclge_get_rss_indir_size,
        .get_rss = hclge_get_rss,
        .set_rss = hclge_set_rss,
        .set_rss_tuple = hclge_set_rss_tuple,
 
 #define HCLGE_RSS_HASH_ALGO_SIMPLE     1
 #define HCLGE_RSS_HASH_ALGO_SYMMETRIC  2
 #define HCLGE_RSS_HASH_ALGO_MASK       GENMASK(3, 0)
-#define HCLGE_RSS_CFG_TBL_NUM \
-       (HCLGE_RSS_IND_TBL_SIZE / HCLGE_RSS_CFG_TBL_SIZE)
 
 #define HCLGE_RSS_INPUT_TUPLE_OTHER    GENMASK(3, 0)
 #define HCLGE_RSS_INPUT_TUPLE_SCTP     GENMASK(4, 0)
 
        u8  rss_hash_key[HCLGE_RSS_KEY_SIZE]; /* User configured hash keys */
        /* User configured lookup table entries */
-       u16 rss_indirection_tbl[HCLGE_RSS_IND_TBL_SIZE];
+       u16 *rss_indirection_tbl;
        int rss_algo;           /* User configured hash algorithm */
        /* User configured rss tuple sets */
        struct hclge_rss_tuple_cfg rss_tuple_sets;
 
        return HCLGEVF_RSS_KEY_SIZE;
 }
 
-static u32 hclgevf_get_rss_indir_size(struct hnae3_handle *handle)
-{
-       return HCLGEVF_RSS_IND_TBL_SIZE;
-}
-
 static int hclgevf_set_rss_indir_table(struct hclgevf_dev *hdev)
 {
        const u8 *indir = hdev->rss_cfg.rss_indirection_tbl;
        struct hclgevf_rss_indirection_table_cmd *req;
        struct hclgevf_desc desc;
+       int rss_cfg_tbl_num;
        int status;
        int i, j;
 
        req = (struct hclgevf_rss_indirection_table_cmd *)desc.data;
+       rss_cfg_tbl_num = hdev->ae_dev->dev_specs.rss_ind_tbl_size /
+                         HCLGEVF_RSS_CFG_TBL_SIZE;
 
-       for (i = 0; i < HCLGEVF_RSS_CFG_TBL_NUM; i++) {
+       for (i = 0; i < rss_cfg_tbl_num; i++) {
                hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_RSS_INDIR_TABLE,
                                             false);
                req->start_table_index = i * HCLGEVF_RSS_CFG_TBL_SIZE;
        }
 
        if (indir)
-               for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
+               for (i = 0; i < hdev->ae_dev->dev_specs.rss_ind_tbl_size; i++)
                        indir[i] = rss_cfg->rss_indirection_tbl[i];
 
        return 0;
        }
 
        /* update the shadow RSS table with user specified qids */
-       for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
+       for (i = 0; i < hdev->ae_dev->dev_specs.rss_ind_tbl_size; i++)
                rss_cfg->rss_indirection_tbl[i] = indir[i];
 
        /* update the hardware */
        return ret;
 }
 
-static void hclgevf_rss_init_cfg(struct hclgevf_dev *hdev)
+static int hclgevf_rss_init_cfg(struct hclgevf_dev *hdev)
 {
+       u16 rss_ind_tbl_size = hdev->ae_dev->dev_specs.rss_ind_tbl_size;
        struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
        struct hclgevf_rss_tuple_cfg *tuple_sets;
        u32 i;
        rss_cfg->rss_size = hdev->nic.kinfo.rss_size;
        tuple_sets = &rss_cfg->rss_tuple_sets;
        if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
+               u8 *rss_ind_tbl;
+
                rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
+
+               rss_ind_tbl = devm_kcalloc(&hdev->pdev->dev, rss_ind_tbl_size,
+                                          sizeof(*rss_ind_tbl), GFP_KERNEL);
+               if (!rss_ind_tbl)
+                       return -ENOMEM;
+
+               rss_cfg->rss_indirection_tbl = rss_ind_tbl;
                memcpy(rss_cfg->rss_hash_key, hclgevf_hash_key,
                       HCLGEVF_RSS_KEY_SIZE);
 
        }
 
        /* Initialize RSS indirect table */
-       for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
+       for (i = 0; i < rss_ind_tbl_size; i++)
                rss_cfg->rss_indirection_tbl[i] = i % rss_cfg->rss_size;
+
+       return 0;
 }
 
 static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
                goto err_config;
 
        /* Initialize RSS for this VF */
-       hclgevf_rss_init_cfg(hdev);
+       ret = hclgevf_rss_init_cfg(hdev);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to init rss cfg, ret = %d\n", ret);
+               goto err_config;
+       }
+
        ret = hclgevf_rss_init_hw(hdev);
        if (ret) {
                dev_err(&hdev->pdev->dev,
                goto out;
 
        /* Reinitializes the rss indirect table according to the new RSS size */
-       rss_indir = kcalloc(HCLGEVF_RSS_IND_TBL_SIZE, sizeof(u32), GFP_KERNEL);
+       rss_indir = kcalloc(hdev->ae_dev->dev_specs.rss_ind_tbl_size,
+                           sizeof(u32), GFP_KERNEL);
        if (!rss_indir)
                return -ENOMEM;
 
-       for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
+       for (i = 0; i < hdev->ae_dev->dev_specs.rss_ind_tbl_size; i++)
                rss_indir[i] = i % kinfo->rss_size;
 
        hdev->rss_cfg.rss_size = kinfo->rss_size;
        .get_strings = hclgevf_get_strings,
        .get_sset_count = hclgevf_get_sset_count,
        .get_rss_key_size = hclgevf_get_rss_key_size,
-       .get_rss_indir_size = hclgevf_get_rss_indir_size,
        .get_rss = hclgevf_get_rss,
        .set_rss = hclgevf_set_rss,
        .get_rss_tuple = hclgevf_get_rss_tuple,
 
 #define HCLGEVF_RSS_HASH_ALGO_SIMPLE   1
 #define HCLGEVF_RSS_HASH_ALGO_SYMMETRIC        2
 #define HCLGEVF_RSS_HASH_ALGO_MASK     0xf
-#define HCLGEVF_RSS_CFG_TBL_NUM \
-       (HCLGEVF_RSS_IND_TBL_SIZE / HCLGEVF_RSS_CFG_TBL_SIZE)
+
 #define HCLGEVF_RSS_INPUT_TUPLE_OTHER  GENMASK(3, 0)
 #define HCLGEVF_RSS_INPUT_TUPLE_SCTP   GENMASK(4, 0)
 #define HCLGEVF_D_PORT_BIT             BIT(0)
        u32 hash_algo;
        u32 rss_size;
        u8 hw_tc_map;
-       u8  rss_indirection_tbl[HCLGEVF_RSS_IND_TBL_SIZE]; /* shadow table */
+       /* shadow table */
+       u8 *rss_indirection_tbl;
        struct hclgevf_rss_tuple_cfg rss_tuple_sets;
 };