OSDN Git Service

qedr: Change the MSI-X vectors selection to be based on affined engine
authorMichal Kalderon <michal.kalderon@marvell.com>
Sun, 26 May 2019 12:22:24 +0000 (15:22 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sun, 26 May 2019 20:04:11 +0000 (13:04 -0700)
Use the msix vectors of the affined hwfn and not the
leading one.

Signed-off-by: Ariel Elior <ariel.elior@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/infiniband/hw/qedr/main.c
drivers/infiniband/hw/qedr/qedr.h
drivers/net/ethernet/qlogic/qed/qed_ll2.c

index 806b3d0..055a631 100644 (file)
@@ -505,11 +505,13 @@ static irqreturn_t qedr_irq_handler(int irq, void *handle)
 static void qedr_sync_free_irqs(struct qedr_dev *dev)
 {
        u32 vector;
+       u16 idx;
        int i;
 
        for (i = 0; i < dev->int_info.used_cnt; i++) {
                if (dev->int_info.msix_cnt) {
-                       vector = dev->int_info.msix[i * dev->num_hwfns].vector;
+                       idx = i * dev->num_hwfns + dev->affin_hwfn_idx;
+                       vector = dev->int_info.msix[idx].vector;
                        synchronize_irq(vector);
                        free_irq(vector, &dev->cnq_array[i]);
                }
@@ -521,6 +523,7 @@ static void qedr_sync_free_irqs(struct qedr_dev *dev)
 static int qedr_req_msix_irqs(struct qedr_dev *dev)
 {
        int i, rc = 0;
+       u16 idx;
 
        if (dev->num_cnq > dev->int_info.msix_cnt) {
                DP_ERR(dev,
@@ -530,7 +533,8 @@ static int qedr_req_msix_irqs(struct qedr_dev *dev)
        }
 
        for (i = 0; i < dev->num_cnq; i++) {
-               rc = request_irq(dev->int_info.msix[i * dev->num_hwfns].vector,
+               idx = i * dev->num_hwfns + dev->affin_hwfn_idx;
+               rc = request_irq(dev->int_info.msix[idx].vector,
                                 qedr_irq_handler, 0, dev->cnq_array[i].name,
                                 &dev->cnq_array[i]);
                if (rc) {
@@ -867,6 +871,7 @@ static struct qedr_dev *qedr_add(struct qed_dev *cdev, struct pci_dev *pdev,
        dev->user_dpm_enabled = dev_info.user_dpm_enabled;
        dev->rdma_type = dev_info.rdma_type;
        dev->num_hwfns = dev_info.common.num_hwfns;
+       dev->affin_hwfn_idx = dev->ops->common->get_affin_hwfn_idx(cdev);
        dev->rdma_ctx = dev->ops->rdma_get_rdma_ctx(cdev);
 
        dev->num_cnq = dev->ops->rdma_get_min_cnq_msix(cdev);
index 6175d1e..a92ca22 100644 (file)
@@ -157,6 +157,8 @@ struct qedr_dev {
        u32                     dp_module;
        u8                      dp_level;
        u8                      num_hwfns;
+#define QEDR_IS_CMT(dev)        ((dev)->num_hwfns > 1)
+       u8                      affin_hwfn_idx;
        u8                      gsi_ll2_handle;
 
        uint                    wq_multiplier;
index dcff69a..19a1a58 100644 (file)
@@ -2156,8 +2156,8 @@ static void _qed_ll2_get_pstats(struct qed_hwfn *p_hwfn,
        p_stats->sent_bcast_pkts += HILO_64_REGPAIR(pstats.sent_bcast_pkts);
 }
 
-int __qed_ll2_get_stats(void *cxt,
-                       u8 connection_handle, struct qed_ll2_stats *p_stats)
+static int __qed_ll2_get_stats(void *cxt, u8 connection_handle,
+                              struct qed_ll2_stats *p_stats)
 {
        struct qed_hwfn *p_hwfn = cxt;
        struct qed_ll2_info *p_ll2_conn = NULL;