scsi: qla2xxx: Use a dedicated interrupt handler for 'handshake-required' ISPs
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>
This commit is contained in:
parent
1b81e7f301
commit
7b2a73963c
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -3593,6 +3593,25 @@ qla24xx_msix_default(int irq, void *dev_id)
|
|||
|
||||
irqreturn_t
|
||||
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;
|
||||
|
@ -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(®->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(®->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[] = {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue