scsi: qla2xxx: Use a dedicated interrupt handler for 'handshake-required' ISPs
authorAndrew Vasquez <andrewv@marvell.com>
Wed, 26 Feb 2020 22:40:11 +0000 (14:40 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 29 Feb 2020 01:32:30 +0000 (20:32 -0500)
There's no point checking flags.disable_msix_handshake in the
interrupt handler hot-path.  Instead perform the check during
queue-pair instantiation and use the proper interrupt handler.

Link: https://lore.kernel.org/r/20200226224022.24518-8-hmadhani@marvell.com
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Andrew Vasquez <andrewv@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mid.c

index 4d07c6e..5182749 100644 (file)
@@ -3250,6 +3250,7 @@ struct isp_operations {
 #define QLA_MSIX_RSP_Q                 0x01
 #define QLA_ATIO_VECTOR                0x02
 #define QLA_MSIX_QPAIR_MULTIQ_RSP_Q    0x03
+#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q_HS 0x04
 
 #define QLA_MIDX_DEFAULT       0
 #define QLA_MIDX_RSP_Q         1
index 73b663d..33ea791 100644 (file)
@@ -565,6 +565,8 @@ qla2x00_process_completed_request(struct scsi_qla_host *, struct req_que *,
        uint32_t);
 extern irqreturn_t
 qla2xxx_msix_rsp_q(int irq, void *dev_id);
+extern irqreturn_t
+qla2xxx_msix_rsp_q_hs(int irq, void *dev_id);
 fc_port_t *qla2x00_find_fcport_by_loopid(scsi_qla_host_t *, uint16_t);
 fc_port_t *qla2x00_find_fcport_by_wwpn(scsi_qla_host_t *, u8 *, u8);
 fc_port_t *qla2x00_find_fcport_by_nportid(scsi_qla_host_t *, port_id_t *, u8);
index 7eb3df4..2918bb0 100644 (file)
@@ -3596,6 +3596,25 @@ qla2xxx_msix_rsp_q(int irq, void *dev_id)
 {
        struct qla_hw_data *ha;
        struct qla_qpair *qpair;
+
+       qpair = dev_id;
+       if (!qpair) {
+               ql_log(ql_log_info, NULL, 0x505b,
+                   "%s: NULL response queue pointer.\n", __func__);
+               return IRQ_NONE;
+       }
+       ha = qpair->hw;
+
+       queue_work(ha->wq, &qpair->q_work);
+
+       return IRQ_HANDLED;
+}
+
+irqreturn_t
+qla2xxx_msix_rsp_q_hs(int irq, void *dev_id)
+{
+       struct qla_hw_data *ha;
+       struct qla_qpair *qpair;
        struct device_reg_24xx __iomem *reg;
        unsigned long flags;
 
@@ -3607,13 +3626,10 @@ qla2xxx_msix_rsp_q(int irq, void *dev_id)
        }
        ha = qpair->hw;
 
-       /* Clear the interrupt, if enabled, for this response queue */
-       if (unlikely(!ha->flags.disable_msix_handshake)) {
-               reg = &ha->iobase->isp24;
-               spin_lock_irqsave(&ha->hardware_lock, flags);
-               WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
-               spin_unlock_irqrestore(&ha->hardware_lock, flags);
-       }
+       reg = &ha->iobase->isp24;
+       spin_lock_irqsave(&ha->hardware_lock, flags);
+       WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
+       spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
        queue_work(ha->wq, &qpair->q_work);
 
@@ -3632,6 +3648,7 @@ static const struct qla_init_msix_entry msix_entries[] = {
        { "rsp_q", qla24xx_msix_rsp_q },
        { "atio_q", qla83xx_msix_atio_q },
        { "qpair_multiq", qla2xxx_msix_rsp_q },
+       { "qpair_multiq_hs", qla2xxx_msix_rsp_q_hs },
 };
 
 static const struct qla_init_msix_entry qla82xx_msix_entries[] = {
index e86c94f..d82e92d 100644 (file)
@@ -896,7 +896,8 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options,
            rsp->rsp_q_out);
 
        ret = qla25xx_request_irq(ha, qpair, qpair->msix,
-           QLA_MSIX_QPAIR_MULTIQ_RSP_Q);
+               ha->flags.disable_msix_handshake ?
+               QLA_MSIX_QPAIR_MULTIQ_RSP_Q : QLA_MSIX_QPAIR_MULTIQ_RSP_Q_HS);
        if (ret)
                goto que_failed;