]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/scsi/sata_nv.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
[karo-tx-linux.git] / drivers / scsi / sata_nv.c
index 2a1bd85404e017bb8c9b0d965ceb872267e7124f..56da25581f31a345486229e187bd7077784f6949 100644 (file)
@@ -31,7 +31,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -44,7 +43,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME                       "sata_nv"
-#define DRV_VERSION                    "0.9"
+#define DRV_VERSION                    "2.0"
 
 enum {
        NV_PORTS                        = 2,
@@ -69,7 +68,8 @@ enum {
        NV_INT_PORT_SHIFT               = 4,    /* each port occupies 4 bits */
 
        NV_INT_ALL                      = 0x0f,
-       NV_INT_MASK                     = NV_INT_DEV,
+       NV_INT_MASK                     = NV_INT_DEV |
+                                         NV_INT_ADDED | NV_INT_REMOVED,
 
        /* INT_CONFIG */
        NV_INT_CONFIG                   = 0x12,
@@ -134,6 +134,10 @@ static const struct pci_device_id nv_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },
+       { PCI_VENDOR_ID_NVIDIA, 0x045c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },
+       { PCI_VENDOR_ID_NVIDIA, 0x045d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },
+       { PCI_VENDOR_ID_NVIDIA, 0x045e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },
+       { PCI_VENDOR_ID_NVIDIA, 0x045f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC },
        { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
                PCI_ANY_ID, PCI_ANY_ID,
                PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC },
@@ -324,6 +328,12 @@ static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
        struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);
        int handled;
 
+       /* freeze if hotplugged */
+       if (unlikely(irq_stat & (NV_INT_ADDED | NV_INT_REMOVED))) {
+               ata_port_freeze(ap);
+               return 1;
+       }
+
        /* bail out if not our interrupt */
        if (!(irq_stat & NV_INT_DEV))
                return 0;
@@ -364,14 +374,13 @@ static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance,
                                    struct pt_regs *regs)
 {
        struct ata_host_set *host_set = dev_instance;
-       unsigned long flags;
        u8 irq_stat;
        irqreturn_t ret;
 
-       spin_lock_irqsave(&host_set->lock, flags);
+       spin_lock(&host_set->lock);
        irq_stat = inb(host_set->ports[0]->ioaddr.scr_addr + NV_INT_STATUS);
        ret = nv_do_interrupt(host_set, irq_stat);
-       spin_unlock_irqrestore(&host_set->lock, flags);
+       spin_unlock(&host_set->lock);
 
        return ret;
 }
@@ -380,14 +389,13 @@ static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance,
                                      struct pt_regs *regs)
 {
        struct ata_host_set *host_set = dev_instance;
-       unsigned long flags;
        u8 irq_stat;
        irqreturn_t ret;
 
-       spin_lock_irqsave(&host_set->lock, flags);
+       spin_lock(&host_set->lock);
        irq_stat = readb(host_set->mmio_base + NV_INT_STATUS_CK804);
        ret = nv_do_interrupt(host_set, irq_stat);
-       spin_unlock_irqrestore(&host_set->lock, flags);
+       spin_unlock(&host_set->lock);
 
        return ret;
 }