aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/sata_promise.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/sata_promise.c')
-rw-r--r--drivers/scsi/sata_promise.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
index b27e2e20280b..4d8201422a12 100644
--- a/drivers/scsi/sata_promise.c
+++ b/drivers/scsi/sata_promise.c
@@ -186,6 +186,10 @@ static struct pci_device_id pdc_ata_pci_tbl[] = {
186 board_20319 }, 186 board_20319 },
187 { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 187 { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
188 board_20319 }, 188 board_20319 },
189 { PCI_VENDOR_ID_PROMISE, 0x3519, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
190 board_20319 },
191 { PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
192 board_20319 },
189 { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 193 { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
190 board_20319 }, 194 board_20319 },
191 195
@@ -326,11 +330,15 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
326 330
327static void pdc_eng_timeout(struct ata_port *ap) 331static void pdc_eng_timeout(struct ata_port *ap)
328{ 332{
333 struct ata_host_set *host_set = ap->host_set;
329 u8 drv_stat; 334 u8 drv_stat;
330 struct ata_queued_cmd *qc; 335 struct ata_queued_cmd *qc;
336 unsigned long flags;
331 337
332 DPRINTK("ENTER\n"); 338 DPRINTK("ENTER\n");
333 339
340 spin_lock_irqsave(&host_set->lock, flags);
341
334 qc = ata_qc_from_tag(ap, ap->active_tag); 342 qc = ata_qc_from_tag(ap, ap->active_tag);
335 if (!qc) { 343 if (!qc) {
336 printk(KERN_ERR "ata%u: BUG: timeout without command\n", 344 printk(KERN_ERR "ata%u: BUG: timeout without command\n",
@@ -364,6 +372,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
364 } 372 }
365 373
366out: 374out:
375 spin_unlock_irqrestore(&host_set->lock, flags);
367 DPRINTK("EXIT\n"); 376 DPRINTK("EXIT\n");
368} 377}
369 378
@@ -446,7 +455,8 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
446 VPRINTK("port %u\n", i); 455 VPRINTK("port %u\n", i);
447 ap = host_set->ports[i]; 456 ap = host_set->ports[i];
448 tmp = mask & (1 << (i + 1)); 457 tmp = mask & (1 << (i + 1));
449 if (tmp && ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { 458 if (tmp && ap &&
459 !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) {
450 struct ata_queued_cmd *qc; 460 struct ata_queued_cmd *qc;
451 461
452 qc = ata_qc_from_tag(ap, ap->active_tag); 462 qc = ata_qc_from_tag(ap, ap->active_tag);