net/qede: fix status block index for VF queues
[dpdk.git] / drivers / net / qede / qede_rxtx.c
index 8f83497..bfcb16c 100644 (file)
@@ -435,9 +435,22 @@ qede_alloc_mem_sb(struct qede_dev *qdev, struct ecore_sb_info *sb_info,
 
 int qede_alloc_fp_resc(struct qede_dev *qdev)
 {
+       struct ecore_dev *edev = &qdev->edev;
        struct qede_fastpath *fp;
+       uint32_t num_sbs;
        int rc, i;
 
+       if (IS_VF(edev))
+               ecore_vf_get_num_sbs(ECORE_LEADING_HWFN(edev), &num_sbs);
+       else
+               num_sbs = (ecore_cxt_get_proto_cid_count
+                         (ECORE_LEADING_HWFN(edev), PROTOCOLID_ETH, NULL)) / 2;
+
+       if (num_sbs == 0) {
+               DP_ERR(edev, "No status blocks available\n");
+               return -EINVAL;
+       }
+
        if (qdev->fp_array)
                qede_free_fp_arrays(qdev);
 
@@ -449,7 +462,7 @@ int qede_alloc_fp_resc(struct qede_dev *qdev)
 
        for (i = 0; i < QEDE_QUEUE_CNT(qdev); i++) {
                fp = &qdev->fp_array[i];
-               if (qede_alloc_mem_sb(qdev, fp->sb_info, i)) {
+               if (qede_alloc_mem_sb(qdev, fp->sb_info, i % num_sbs)) {
                        qede_free_fp_arrays(qdev);
                        return -ENOMEM;
                }