Merge /spare/repo/linux-2.6/
authorJeff Garzik <jgarzik@pobox.com>
Mon, 29 Aug 2005 23:06:29 +0000 (19:06 -0400)
committerJeff Garzik <jgarzik@pobox.com>
Mon, 29 Aug 2005 23:06:29 +0000 (19:06 -0400)
1  2 
drivers/scsi/sata_promise.c

index ad31b8afec6fc6050f55cd79382a836e5227c348,4d8201422a1232a3f0ff597f3bfb510c0ef221b1..7c4f6ecc1cc9bb218f4e91a50a414f7bc36d2690
@@@ -7,21 -7,26 +7,26 @@@
   *
   *  Copyright 2003-2004 Red Hat, Inc.
   *
-  *  The contents of this file are subject to the Open
-  *  Software License version 1.1 that can be found at
-  *  http://www.opensource.org/licenses/osl-1.1.txt and is included herein
-  *  by reference.
   *
-  *  Alternatively, the contents of this file may be used under the terms
-  *  of the GNU General Public License version 2 (the "GPL") as distributed
-  *  in the kernel source COPYING file, in which case the provisions of
-  *  the GPL are applicable instead of the above.  If you wish to allow
-  *  the use of your version of this file only under the terms of the
-  *  GPL and not to allow others to use your version of this file under
-  *  the OSL, indicate your decision by deleting the provisions above and
-  *  replace them with the notice and other provisions required by the GPL.
-  *  If you do not delete the provisions above, a recipient may use your
-  *  version of this file under either the OSL or the GPL.
+  *  This program is free software; you can redistribute it and/or modify
+  *  it under the terms of the GNU General Public License as published by
+  *  the Free Software Foundation; either version 2, or (at your option)
+  *  any later version.
+  *
+  *  This program is distributed in the hope that it will be useful,
+  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  *  GNU General Public License for more details.
+  *
+  *  You should have received a copy of the GNU General Public License
+  *  along with this program; see the file COPYING.  If not, write to
+  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+  *
+  *  libata documentation is available via 'make {ps|pdf}docs',
+  *  as Documentation/DocBook/libata.*
+  *
+  *  Hardware information only available under NDA.
   *
   */
  
@@@ -79,8 -84,7 +84,8 @@@ static irqreturn_t pdc_interrupt (int i
  static void pdc_eng_timeout(struct ata_port *ap);
  static int pdc_port_start(struct ata_port *ap);
  static void pdc_port_stop(struct ata_port *ap);
 -static void pdc_phy_reset(struct ata_port *ap);
 +static void pdc_pata_phy_reset(struct ata_port *ap);
 +static void pdc_sata_phy_reset(struct ata_port *ap);
  static void pdc_qc_prep(struct ata_queued_cmd *qc);
  static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf);
  static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf);
@@@ -107,22 -111,19 +112,22 @@@ static Scsi_Host_Template pdc_ata_sht 
        .ordered_flush          = 1,
  };
  
 -static struct ata_port_operations pdc_ata_ops = {
 +static struct ata_port_operations pdc_sata_ops = {
        .port_disable           = ata_port_disable,
        .tf_load                = pdc_tf_load_mmio,
        .tf_read                = ata_tf_read,
        .check_status           = ata_check_status,
        .exec_command           = pdc_exec_command_mmio,
        .dev_select             = ata_std_dev_select,
 -      .phy_reset              = pdc_phy_reset,
 +
 +      .phy_reset              = pdc_sata_phy_reset,
 +
        .qc_prep                = pdc_qc_prep,
        .qc_issue               = pdc_qc_issue_prot,
        .eng_timeout            = pdc_eng_timeout,
        .irq_handler            = pdc_interrupt,
        .irq_clear              = pdc_irq_clear,
 +
        .scr_read               = pdc_sata_scr_read,
        .scr_write              = pdc_sata_scr_write,
        .port_start             = pdc_port_start,
        .host_stop              = ata_host_stop,
  };
  
 +static struct ata_port_operations pdc_pata_ops = {
 +      .port_disable           = ata_port_disable,
 +      .tf_load                = pdc_tf_load_mmio,
 +      .tf_read                = ata_tf_read,
 +      .check_status           = ata_check_status,
 +      .exec_command           = pdc_exec_command_mmio,
 +      .dev_select             = ata_std_dev_select,
 +
 +      .phy_reset              = pdc_pata_phy_reset,
 +
 +      .qc_prep                = pdc_qc_prep,
 +      .qc_issue               = pdc_qc_issue_prot,
 +      .eng_timeout            = pdc_eng_timeout,
 +      .irq_handler            = pdc_interrupt,
 +      .irq_clear              = pdc_irq_clear,
 +
 +      .port_start             = pdc_port_start,
 +      .port_stop              = pdc_port_stop,
 +      .host_stop              = ata_host_stop,
 +};
 +
  static struct ata_port_info pdc_port_info[] = {
        /* board_2037x */
        {
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
 -              .port_ops       = &pdc_ata_ops,
 +              .port_ops       = &pdc_sata_ops,
        },
  
        /* board_20319 */
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
 -              .port_ops       = &pdc_ata_ops,
 +              .port_ops       = &pdc_sata_ops,
        },
  
        /* board_20619 */
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
 -              .port_ops       = &pdc_ata_ops,
 +              .port_ops       = &pdc_pata_ops,
        },
  };
  
@@@ -206,6 -186,10 +211,10 @@@ static struct pci_device_id pdc_ata_pci
          board_20319 },
        { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_20319 },
+       { PCI_VENDOR_ID_PROMISE, 0x3519, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_20319 },
+       { PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_20319 },
        { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_20319 },
  
@@@ -293,23 -277,12 +302,23 @@@ static void pdc_reset_port(struct ata_p
        readl(mmio);    /* flush */
  }
  
 -static void pdc_phy_reset(struct ata_port *ap)
 +static void pdc_sata_phy_reset(struct ata_port *ap)
  {
        pdc_reset_port(ap);
        sata_phy_reset(ap);
  }
  
 +static void pdc_pata_phy_reset(struct ata_port *ap)
 +{
 +      /* FIXME: add cable detect.  Don't assume 40-pin cable */
 +      ap->cbl = ATA_CBL_PATA40;
 +      ap->udma_mask &= ATA_UDMA_MASK_40C;
 +
 +      pdc_reset_port(ap);
 +      ata_port_probe(ap);
 +      ata_bus_reset(ap);
 +}
 +
  static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
  {
        if (sc_reg > SCR_CONTROL)
@@@ -357,11 -330,15 +366,15 @@@ static void pdc_qc_prep(struct ata_queu
  
  static void pdc_eng_timeout(struct ata_port *ap)
  {
+       struct ata_host_set *host_set = ap->host_set;
        u8 drv_stat;
        struct ata_queued_cmd *qc;
+       unsigned long flags;
  
        DPRINTK("ENTER\n");
  
+       spin_lock_irqsave(&host_set->lock, flags);
        qc = ata_qc_from_tag(ap, ap->active_tag);
        if (!qc) {
                printk(KERN_ERR "ata%u: BUG: timeout without command\n",
        }
  
  out:
+       spin_unlock_irqrestore(&host_set->lock, flags);
        DPRINTK("EXIT\n");
  }
  
@@@ -477,7 -455,8 +491,8 @@@ static irqreturn_t pdc_interrupt (int i
                VPRINTK("port %u\n", i);
                ap = host_set->ports[i];
                tmp = mask & (1 << (i + 1));
-               if (tmp && ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) {
+               if (tmp && ap &&
+                   !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) {
                        struct ata_queued_cmd *qc;
  
                        qc = ata_qc_from_tag(ap, ap->active_tag);