diff options
Diffstat (limited to 'drivers/scsi/sata_promise.c')
-rw-r--r-- | drivers/scsi/sata_promise.c | 12 |
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 | ||
327 | static void pdc_eng_timeout(struct ata_port *ap) | 331 | static 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 | ||
366 | out: | 374 | out: |
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); |