Merge branch 'upstream'
authorJeff Garzik <jeff@garzik.org>
Fri, 24 Mar 2006 14:24:04 +0000 (09:24 -0500)
committerJeff Garzik <jeff@garzik.org>
Fri, 24 Mar 2006 14:24:04 +0000 (09:24 -0500)
Conflicts:

drivers/scsi/sata_vsc.c

1  2 
drivers/scsi/libata-core.c
drivers/scsi/pdc_adma.c
drivers/scsi/sata_mv.c
drivers/scsi/sata_nv.c
drivers/scsi/sata_promise.c
drivers/scsi/sata_qstor.c
drivers/scsi/sata_sx4.c
drivers/scsi/sata_vsc.c
include/linux/ata.h
include/linux/libata.h

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -215,22 -221,30 +221,38 @@@ static irqreturn_t vsc_sata_interrupt (
  
                        ap = host_set->ports[i];
  
-                       if (ap && !(ap->flags & ATA_FLAG_PORT_DISABLED)) {
 +                      if (is_vsc_sata_int_err(i, int_status)) {
 +                              u32 err_status;
 +                              printk(KERN_DEBUG "%s: ignoring interrupt(s)\n", __FUNCTION__);
 +                              err_status = ap ? vsc_sata_scr_read(ap, SCR_ERROR) : 0;
 +                              vsc_sata_scr_write(ap, SCR_ERROR, err_status);
 +                              handled++;
 +                      }
 +
+                       if (ap && !(ap->flags &
+                                   (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) {
                                struct ata_queued_cmd *qc;
  
                                qc = ata_qc_from_tag(ap, ap->active_tag);
 -                              if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
 +                              if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
                                        handled += ata_host_intr(ap, qc);
-                               else {
-                                       printk(KERN_DEBUG "%s: ignoring interrupt(s)\n", __FUNCTION__);
+                               } else if (is_vsc_sata_int_err(i, int_status)) {
+                                       /*
+                                        * On some chips (i.e. Intel 31244), an error 
+                                        * interrupt will sneak in at initialization
+                                        * time (phy state changes).  Clearing the SCR
+                                        * error register is not required, but it prevents
+                                        * the phy state change interrupts from recurring 
+                                        * later.
+                                        */
+                                       u32 err_status;
+                                       err_status = vsc_sata_scr_read(ap, SCR_ERROR);
+                                       printk(KERN_DEBUG "%s: clearing interrupt, "
+                                              "status %x; sata err status %x\n",
+                                              __FUNCTION__,
+                                              int_status, err_status);
+                                       vsc_sata_scr_write(ap, SCR_ERROR, err_status);
+                                       /* Clear interrupt status */
                                        ata_chk_status(ap);
                                        handled++;
                                }
Simple merge
Simple merge