Most structures pointer used in *_intr_reg_init() are already used in
idpf_vport_intr_req_irq(). Use it by rewriting *_intr_reg_init() to
fill one q_vector in one call.

Reviewed-by: Aleksandr Loktionov <[email protected]>
Reviewed-by: Madhu Chittim <[email protected]>
Signed-off-by: Michal Swiatkowski <[email protected]>
---
 drivers/net/ethernet/intel/idpf/idpf.h        |  7 +-
 drivers/net/ethernet/intel/idpf/idpf_dev.c    | 91 +++++++++---------
 drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  7 +-
 drivers/net/ethernet/intel/idpf/idpf_vf_dev.c | 92 ++++++++++---------
 4 files changed, 105 insertions(+), 92 deletions(-)

diff --git a/drivers/net/ethernet/intel/idpf/idpf.h 
b/drivers/net/ethernet/intel/idpf/idpf.h
index 84b145431693..5eafabacd167 100644
--- a/drivers/net/ethernet/intel/idpf/idpf.h
+++ b/drivers/net/ethernet/intel/idpf/idpf.h
@@ -197,6 +197,7 @@ struct idpf_vport_max_q {
  * struct idpf_reg_ops - Device specific register operation function pointers
  * @ctlq_reg_init: Mailbox control queue register initialization
  * @intr_reg_init: Traffic interrupt register initialization
+ * @noirq_intr_reg_init: Vector without interrupt register initialization
  * @mb_intr_reg_init: Mailbox interrupt register initialization
  * @reset_reg_init: Reset register initialization
  * @trigger_reset: Trigger a reset to occur
@@ -205,8 +206,10 @@ struct idpf_vport_max_q {
 struct idpf_reg_ops {
        void (*ctlq_reg_init)(struct libie_mmio_info *mmio,
                              struct libie_ctlq_create_info *cctlq_info);
-       void (*intr_reg_init)(struct idpf_vport *vport,
-                             struct idpf_q_vec_rsrc *rsrc);
+       void (*intr_reg_init)(struct idpf_adapter *adapter,
+                             struct idpf_q_vector *q_vector, u16 idx);
+       void (*noirq_intr_reg_init)(struct idpf_adapter *adapter,
+                                   struct idpf_q_vec_rsrc *rsrc, u16 idx);
        void (*mb_intr_reg_init)(struct idpf_adapter *adapter);
        void (*reset_reg_init)(struct idpf_adapter *adapter);
        void (*trigger_reset)(struct idpf_adapter *adapter,
diff --git a/drivers/net/ethernet/intel/idpf/idpf_dev.c 
b/drivers/net/ethernet/intel/idpf/idpf_dev.c
index 42e65f1285df..cd947fd24ff6 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_dev.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_dev.c
@@ -58,53 +58,17 @@ static void idpf_mb_intr_reg_init(struct idpf_adapter 
*adapter)
 }
 
 /**
- * idpf_intr_reg_init - Initialize interrupt registers
- * @vport: virtual port structure
- * @rsrc: pointer to queue and vector resources
+ * idpf_noirq_intr_reg_init - Initialize noirq registers
+ * @adapter: adapter structure
+ * @rsrc: to store noirq register and value
+ * @idx: global software irq index used to get hardware information from
+ *      irq_info structure
  */
-static void idpf_intr_reg_init(struct idpf_vport *vport,
-                              struct idpf_q_vec_rsrc *rsrc)
+static void idpf_noirq_intr_reg_init(struct idpf_adapter *adapter,
+                                    struct idpf_q_vec_rsrc *rsrc, u16 idx)
 {
-       struct idpf_adapter *adapter = vport->adapter;
-       int num_vecs = rsrc->num_q_vectors;
-       struct libie_mmio_info *mmio;
-       u32 rx_itr, tx_itr, val;
-       int i;
-
-       mmio = &adapter->ctlq_ctx.mmio_info;
+       u32 val = adapter->irq_info.vectors[idx].regs.dyn_ctl;
 
-       for (i = 0; i < num_vecs; i++) {
-               struct idpf_q_vector *q_vector = &rsrc->q_vectors[i];
-               struct idpf_intr_reg *intr = &q_vector->intr_reg;
-               u16 vec_id = rsrc->q_vector_idxs[i];
-               struct idpf_hw_vector *v;
-               u32 spacing;
-
-               v = &adapter->irq_info.vectors[vec_id];
-
-               intr->dyn_ctl = libie_pci_get_mmio_addr(mmio, v->regs.dyn_ctl);
-               intr->dyn_ctl_intena_m = PF_GLINT_DYN_CTL_INTENA_M;
-               intr->dyn_ctl_intena_msk_m = PF_GLINT_DYN_CTL_INTENA_MSK_M;
-               intr->dyn_ctl_itridx_s = PF_GLINT_DYN_CTL_ITR_INDX_S;
-               intr->dyn_ctl_intrvl_s = PF_GLINT_DYN_CTL_INTERVAL_S;
-               intr->dyn_ctl_wb_on_itr_m = PF_GLINT_DYN_CTL_WB_ON_ITR_M;
-               intr->dyn_ctl_swint_trig_m = PF_GLINT_DYN_CTL_SWINT_TRIG_M;
-               intr->dyn_ctl_sw_itridx_ena_m =
-                       PF_GLINT_DYN_CTL_SW_ITR_INDX_ENA_M;
-
-               spacing = IDPF_ITR_IDX_SPACING(v->regs.itrn_index_spacing,
-                                              IDPF_PF_ITR_IDX_SPACING);
-               rx_itr = PF_GLINT_ITR_ADDR(VIRTCHNL2_ITR_IDX_0, v->regs.itrn,
-                                          spacing);
-               tx_itr = PF_GLINT_ITR_ADDR(VIRTCHNL2_ITR_IDX_1, v->regs.itrn,
-                                          spacing);
-               intr->rx_itr = libie_pci_get_mmio_addr(mmio, rx_itr);
-               intr->tx_itr = libie_pci_get_mmio_addr(mmio, tx_itr);
-       }
-
-       /* Data vector for NOIRQ queues */
-
-       val = adapter->irq_info.vectors[rsrc->q_vector_idxs[i]].regs.dyn_ctl;
        rsrc->noirq_dyn_ctl =
                libie_pci_get_mmio_addr(&adapter->ctlq_ctx.mmio_info, val);
 
@@ -113,6 +77,44 @@ static void idpf_intr_reg_init(struct idpf_vport *vport,
        rsrc->noirq_dyn_ctl_ena = val;
 }
 
+/**
+ * idpf_intr_reg_init - Initialize interrupt registers
+ * @adapter: adapter structure
+ * @q_vector: q_vector in which the registers should be initialized
+ * @idx: global software irq index used to get hardware information from
+ *      irq_info structure
+ */
+static void idpf_intr_reg_init(struct idpf_adapter *adapter,
+                              struct idpf_q_vector *q_vector, u16 idx)
+{
+       struct idpf_hw_vector *v = &adapter->irq_info.vectors[idx];
+       struct idpf_intr_reg *intr = &q_vector->intr_reg;
+       struct libie_mmio_info *mmio;
+       u32 rx_itr, tx_itr;
+       u32 spacing;
+
+       mmio = &adapter->ctlq_ctx.mmio_info;
+
+       intr->dyn_ctl = libie_pci_get_mmio_addr(mmio, v->regs.dyn_ctl);
+       intr->dyn_ctl_intena_m = PF_GLINT_DYN_CTL_INTENA_M;
+       intr->dyn_ctl_intena_msk_m = PF_GLINT_DYN_CTL_INTENA_MSK_M;
+       intr->dyn_ctl_itridx_s = PF_GLINT_DYN_CTL_ITR_INDX_S;
+       intr->dyn_ctl_intrvl_s = PF_GLINT_DYN_CTL_INTERVAL_S;
+       intr->dyn_ctl_wb_on_itr_m = PF_GLINT_DYN_CTL_WB_ON_ITR_M;
+       intr->dyn_ctl_swint_trig_m = PF_GLINT_DYN_CTL_SWINT_TRIG_M;
+       intr->dyn_ctl_sw_itridx_ena_m =
+               PF_GLINT_DYN_CTL_SW_ITR_INDX_ENA_M;
+
+       spacing = IDPF_ITR_IDX_SPACING(v->regs.itrn_index_spacing,
+                                      IDPF_PF_ITR_IDX_SPACING);
+       rx_itr = PF_GLINT_ITR_ADDR(VIRTCHNL2_ITR_IDX_0, v->regs.itrn,
+                                  spacing);
+       tx_itr = PF_GLINT_ITR_ADDR(VIRTCHNL2_ITR_IDX_1, v->regs.itrn,
+                                  spacing);
+       intr->rx_itr = libie_pci_get_mmio_addr(mmio, rx_itr);
+       intr->tx_itr = libie_pci_get_mmio_addr(mmio, tx_itr);
+}
+
 /**
  * idpf_reset_reg_init - Initialize reset registers
  * @adapter: Driver specific private structure
@@ -171,6 +173,7 @@ static void idpf_reg_ops_init(struct idpf_adapter *adapter)
 {
        adapter->dev_ops.reg_ops.ctlq_reg_init = idpf_ctlq_reg_init;
        adapter->dev_ops.reg_ops.intr_reg_init = idpf_intr_reg_init;
+       adapter->dev_ops.reg_ops.noirq_intr_reg_init = idpf_noirq_intr_reg_init;
        adapter->dev_ops.reg_ops.mb_intr_reg_init = idpf_mb_intr_reg_init;
        adapter->dev_ops.reg_ops.reset_reg_init = idpf_reset_reg_init;
        adapter->dev_ops.reg_ops.trigger_reset = idpf_trigger_reset;
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c 
b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index 2b21f599f569..00c8fe692821 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -4054,6 +4054,9 @@ static int idpf_vport_intr_req_irq(struct idpf_vport 
*vport,
        const char *drv_name, *if_name, *vec_name;
        int vector, err, irq_num, vidx;
 
+       vidx = rsrc->q_vector_idxs[rsrc->num_q_vectors];
+       adapter->dev_ops.reg_ops.noirq_intr_reg_init(adapter, rsrc, vidx);
+
        drv_name = dev_driver_string(&adapter->pdev->dev);
        if_name = netdev_name(vport->netdev);
 
@@ -4064,6 +4067,8 @@ static int idpf_vport_intr_req_irq(struct idpf_vport 
*vport,
                vidx = rsrc->q_vector_idxs[vector];
                irq_num = adapter->msix_entries[vidx].vector;
 
+               adapter->dev_ops.reg_ops.intr_reg_init(adapter, q_vector, vidx);
+
                if (q_vector->num_rxq && q_vector->num_txq)
                        vec_name = "TxRx";
                else if (q_vector->num_rxq)
@@ -4649,8 +4654,6 @@ int idpf_vport_intr_init(struct idpf_vport *vport, struct 
idpf_q_vec_rsrc *rsrc)
        idpf_vport_intr_map_vector_to_qs(vport, rsrc);
        idpf_vport_intr_napi_add_all(vport, rsrc);
 
-       vport->adapter->dev_ops.reg_ops.intr_reg_init(vport, rsrc);
-
        err = idpf_vport_intr_req_irq(vport, rsrc);
        if (err)
                goto unroll_vectors_alloc;
diff --git a/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c 
b/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c
index c0080842b7e2..df3eabe12b18 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c
@@ -57,53 +57,17 @@ static void idpf_vf_mb_intr_reg_init(struct idpf_adapter 
*adapter)
 }
 
 /**
- * idpf_vf_intr_reg_init - Initialize interrupt registers
- * @vport: virtual port structure
- * @rsrc: pointer to queue and vector resources
+ * idpf_vf_noirq_intr_reg_init - Initialize noirq registers
+ * @adapter: adapter structure
+ * @rsrc: to store noirq register and value
+ * @idx: global software irq index used to get hardware information from
+ *      irq_info structure
  */
-static void idpf_vf_intr_reg_init(struct idpf_vport *vport,
-                                 struct idpf_q_vec_rsrc *rsrc)
+static void idpf_vf_noirq_intr_reg_init(struct idpf_adapter *adapter,
+                                       struct idpf_q_vec_rsrc *rsrc, u16 idx)
 {
-       struct idpf_adapter *adapter = vport->adapter;
-       int num_vecs = rsrc->num_q_vectors;
-       struct libie_mmio_info *mmio;
-       u32 rx_itr, tx_itr, val;
-       int i;
-
-       mmio = &adapter->ctlq_ctx.mmio_info;
+       u32 val = adapter->irq_info.vectors[idx].regs.dyn_ctl;
 
-       for (i = 0; i < num_vecs; i++) {
-               struct idpf_q_vector *q_vector = &rsrc->q_vectors[i];
-               struct idpf_intr_reg *intr = &q_vector->intr_reg;
-               u16 vec_id = rsrc->q_vector_idxs[i];
-               struct idpf_hw_vector *v;
-               u32 spacing;
-
-               v = &adapter->irq_info.vectors[vec_id];
-
-               intr->dyn_ctl = libie_pci_get_mmio_addr(mmio, v->regs.dyn_ctl);
-               intr->dyn_ctl_intena_m = VF_INT_DYN_CTLN_INTENA_M;
-               intr->dyn_ctl_intena_msk_m = VF_INT_DYN_CTLN_INTENA_MSK_M;
-               intr->dyn_ctl_itridx_s = VF_INT_DYN_CTLN_ITR_INDX_S;
-               intr->dyn_ctl_intrvl_s = VF_INT_DYN_CTLN_INTERVAL_S;
-               intr->dyn_ctl_wb_on_itr_m = VF_INT_DYN_CTLN_WB_ON_ITR_M;
-               intr->dyn_ctl_swint_trig_m = VF_INT_DYN_CTLN_SWINT_TRIG_M;
-               intr->dyn_ctl_sw_itridx_ena_m =
-                       VF_INT_DYN_CTLN_SW_ITR_INDX_ENA_M;
-
-               spacing = IDPF_ITR_IDX_SPACING(v->regs.itrn_index_spacing,
-                                              IDPF_VF_ITR_IDX_SPACING);
-               rx_itr = VF_INT_ITRN_ADDR(VIRTCHNL2_ITR_IDX_0, v->regs.itrn,
-                                         spacing);
-               tx_itr = VF_INT_ITRN_ADDR(VIRTCHNL2_ITR_IDX_1, v->regs.itrn,
-                                         spacing);
-               intr->rx_itr = libie_pci_get_mmio_addr(mmio, rx_itr);
-               intr->tx_itr = libie_pci_get_mmio_addr(mmio, tx_itr);
-       }
-
-       /* Data vector for NOIRQ queues */
-
-       val = adapter->irq_info.vectors[rsrc->q_vector_idxs[i]].regs.dyn_ctl;
        rsrc->noirq_dyn_ctl =
                libie_pci_get_mmio_addr(&adapter->ctlq_ctx.mmio_info, val);
 
@@ -112,6 +76,44 @@ static void idpf_vf_intr_reg_init(struct idpf_vport *vport,
        rsrc->noirq_dyn_ctl_ena = val;
 }
 
+/**
+ * idpf_vf_intr_reg_init - Initialize interrupt registers
+ * @adapter: adapter structure
+ * @q_vector: q_vector in which the registers should be initialized
+ * @idx: global software irq index used to get hardware information from
+ *      irq_info structure
+ */
+static void idpf_vf_intr_reg_init(struct idpf_adapter *adapter,
+                                 struct idpf_q_vector *q_vector, u16 idx)
+{
+       struct idpf_hw_vector *v = &adapter->irq_info.vectors[idx];
+       struct idpf_intr_reg *intr = &q_vector->intr_reg;
+       struct libie_mmio_info *mmio;
+       u32 rx_itr, tx_itr;
+       u32 spacing;
+
+       mmio = &adapter->ctlq_ctx.mmio_info;
+
+       intr->dyn_ctl = libie_pci_get_mmio_addr(mmio, v->regs.dyn_ctl);
+       intr->dyn_ctl_intena_m = VF_INT_DYN_CTLN_INTENA_M;
+       intr->dyn_ctl_intena_msk_m = VF_INT_DYN_CTLN_INTENA_MSK_M;
+       intr->dyn_ctl_itridx_s = VF_INT_DYN_CTLN_ITR_INDX_S;
+       intr->dyn_ctl_intrvl_s = VF_INT_DYN_CTLN_INTERVAL_S;
+       intr->dyn_ctl_wb_on_itr_m = VF_INT_DYN_CTLN_WB_ON_ITR_M;
+       intr->dyn_ctl_swint_trig_m = VF_INT_DYN_CTLN_SWINT_TRIG_M;
+       intr->dyn_ctl_sw_itridx_ena_m =
+               VF_INT_DYN_CTLN_SW_ITR_INDX_ENA_M;
+
+       spacing = IDPF_ITR_IDX_SPACING(v->regs.itrn_index_spacing,
+                                      IDPF_VF_ITR_IDX_SPACING);
+       rx_itr = VF_INT_ITRN_ADDR(VIRTCHNL2_ITR_IDX_0, v->regs.itrn,
+                                 spacing);
+       tx_itr = VF_INT_ITRN_ADDR(VIRTCHNL2_ITR_IDX_1, v->regs.itrn,
+                                 spacing);
+       intr->rx_itr = libie_pci_get_mmio_addr(mmio, rx_itr);
+       intr->tx_itr = libie_pci_get_mmio_addr(mmio, tx_itr);
+}
+
 /**
  * idpf_vf_reset_reg_init - Initialize reset registers
  * @adapter: Driver specific private structure
@@ -157,6 +159,8 @@ static void idpf_vf_reg_ops_init(struct idpf_adapter 
*adapter)
 {
        adapter->dev_ops.reg_ops.ctlq_reg_init = idpf_vf_ctlq_reg_init;
        adapter->dev_ops.reg_ops.intr_reg_init = idpf_vf_intr_reg_init;
+       adapter->dev_ops.reg_ops.noirq_intr_reg_init =
+               idpf_vf_noirq_intr_reg_init;
        adapter->dev_ops.reg_ops.mb_intr_reg_init = idpf_vf_mb_intr_reg_init;
        adapter->dev_ops.reg_ops.reset_reg_init = idpf_vf_reset_reg_init;
        adapter->dev_ops.reg_ops.trigger_reset = idpf_vf_trigger_reset;
-- 
2.49.0

Reply via email to