mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-20 20:21:30 +00:00
IRQ handlers can be called without IRQs disabled and IRQF_DISABLED
doesn't work with IRQF_SHARED on modern kernels. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@4100 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -38,6 +38,7 @@ qla2100_intr_handler(int irq, void *dev_id)
|
||||
unsigned long iter;
|
||||
uint16_t hccr;
|
||||
uint16_t mb[4];
|
||||
unsigned long flags;
|
||||
|
||||
ha = (scsi_qla_host_t *) dev_id;
|
||||
if (!ha) {
|
||||
@@ -49,7 +50,7 @@ qla2100_intr_handler(int irq, void *dev_id)
|
||||
reg = &ha->iobase->isp;
|
||||
status = 0;
|
||||
|
||||
spin_lock(&ha->hardware_lock);
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
for (iter = 50; iter--; ) {
|
||||
hccr = RD_REG_WORD(®->hccr);
|
||||
if (hccr & HCCR_RISC_PAUSE) {
|
||||
@@ -100,7 +101,7 @@ qla2100_intr_handler(int irq, void *dev_id)
|
||||
RD_REG_WORD(®->hccr);
|
||||
}
|
||||
}
|
||||
spin_unlock(&ha->hardware_lock);
|
||||
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
||||
|
||||
if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
|
||||
(status & MBX_INTERRUPT) && ha->flags.mbox_int) {
|
||||
@@ -130,6 +131,7 @@ qla2300_intr_handler(int irq, void *dev_id)
|
||||
uint32_t stat;
|
||||
uint16_t hccr;
|
||||
uint16_t mb[4];
|
||||
unsigned long flags;
|
||||
|
||||
ha = (scsi_qla_host_t *) dev_id;
|
||||
if (!ha) {
|
||||
@@ -141,7 +143,7 @@ qla2300_intr_handler(int irq, void *dev_id)
|
||||
reg = &ha->iobase->isp;
|
||||
status = 0;
|
||||
|
||||
spin_lock(&ha->hardware_lock);
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
for (iter = 50; iter--; ) {
|
||||
stat = RD_REG_DWORD(®->u.isp2300.host_status);
|
||||
if (stat & HSR_RISC_PAUSED) {
|
||||
@@ -219,7 +221,7 @@ qla2300_intr_handler(int irq, void *dev_id)
|
||||
WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT);
|
||||
RD_REG_WORD_RELAXED(®->hccr);
|
||||
}
|
||||
spin_unlock(&ha->hardware_lock);
|
||||
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
||||
|
||||
if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
|
||||
(status & MBX_INTERRUPT) && ha->flags.mbox_int) {
|
||||
@@ -1830,6 +1832,7 @@ qla24xx_intr_handler(int irq, void *dev_id)
|
||||
uint32_t stat;
|
||||
uint32_t hccr;
|
||||
uint16_t mb[4];
|
||||
unsigned long flags;
|
||||
|
||||
ha = (scsi_qla_host_t *) dev_id;
|
||||
if (!ha) {
|
||||
@@ -1841,7 +1844,7 @@ qla24xx_intr_handler(int irq, void *dev_id)
|
||||
reg = &ha->iobase->isp24;
|
||||
status = 0;
|
||||
|
||||
spin_lock(&ha->hardware_lock);
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
for (iter = 50; iter--; ) {
|
||||
stat = RD_REG_DWORD(®->host_status);
|
||||
if (stat & HSRX_RISC_PAUSED) {
|
||||
@@ -1904,7 +1907,7 @@ qla24xx_intr_handler(int irq, void *dev_id)
|
||||
WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
|
||||
RD_REG_DWORD_RELAXED(®->hccr);
|
||||
}
|
||||
spin_unlock(&ha->hardware_lock);
|
||||
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
||||
|
||||
if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
|
||||
(status & MBX_INTERRUPT) && ha->flags.mbox_int) {
|
||||
@@ -2190,7 +2193,7 @@ skip_msix:
|
||||
skip_msi:
|
||||
|
||||
ret = request_irq(ha->pdev->irq, ha->isp_ops->intr_handler,
|
||||
IRQF_DISABLED|IRQF_SHARED, QLA2XXX_DRIVER_NAME, ha);
|
||||
IRQF_SHARED, QLA2XXX_DRIVER_NAME, ha);
|
||||
if (ret) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Failed to reserve interrupt %d already in use.\n",
|
||||
|
||||
Reference in New Issue
Block a user