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 919fb314ad10..b8dc49fed769 100644
--- a/drivers/scsi/sata_promise.c
+++ b/drivers/scsi/sata_promise.c
@@ -181,6 +181,10 @@ static struct pci_device_id pdc_ata_pci_tbl[] = {
181 board_20319 }, 181 board_20319 },
182 { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 182 { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
183 board_20319 }, 183 board_20319 },
184 { PCI_VENDOR_ID_PROMISE, 0x3519, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
185 board_20319 },
186 { PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
187 board_20319 },
184 { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 188 { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
185 board_20319 }, 189 board_20319 },
186 190
@@ -321,11 +325,15 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
321 325
322static void pdc_eng_timeout(struct ata_port *ap) 326static void pdc_eng_timeout(struct ata_port *ap)
323{ 327{
328 struct ata_host_set *host_set = ap->host_set;
324 u8 drv_stat; 329 u8 drv_stat;
325 struct ata_queued_cmd *qc; 330 struct ata_queued_cmd *qc;
331 unsigned long flags;
326 332
327 DPRINTK("ENTER\n"); 333 DPRINTK("ENTER\n");
328 334
335 spin_lock_irqsave(&host_set->lock, flags);
336
329 qc = ata_qc_from_tag(ap, ap->active_tag); 337 qc = ata_qc_from_tag(ap, ap->active_tag);
330 if (!qc) { 338 if (!qc) {
331 printk(KERN_ERR "ata%u: BUG: timeout without command\n", 339 printk(KERN_ERR "ata%u: BUG: timeout without command\n",
@@ -359,6 +367,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
359 } 367 }
360 368
361out: 369out:
370 spin_unlock_irqrestore(&host_set->lock, flags);
362 DPRINTK("EXIT\n"); 371 DPRINTK("EXIT\n");
363} 372}
364 373
@@ -441,7 +450,8 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
441 VPRINTK("port %u\n", i); 450 VPRINTK("port %u\n", i);
442 ap = host_set->ports[i]; 451 ap = host_set->ports[i];
443 tmp = mask & (1 << (i + 1)); 452 tmp = mask & (1 << (i + 1));
444 if (tmp && ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { 453 if (tmp && ap &&
454 !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) {
445 struct ata_queued_cmd *qc; 455 struct ata_queued_cmd *qc;
446 456
447 qc = ata_qc_from_tag(ap, ap->active_tag); 457 qc = ata_qc_from_tag(ap, ap->active_tag);