[SCSI] aacraid driver update
authorLeubner, Achim <Achim_Leubner@adaptec.com>
Wed, 1 Apr 2009 14:16:08 +0000 (07:16 -0700)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 3 Apr 2009 14:23:11 +0000 (09:23 -0500)
changes:

- set aac_cache=2 as default value to avoid performance problem
  (Novell bugzilla #469922)

- Dell/PERC controller boot problem fixed (RedHat bugzilla #457552)

- WWN flag added to fix SLES10 SP1/SP2 drive detection problems

- 64-bit support changes

- DECLARE_PCI_DEVICE_TABLE macro added

- controller type changes

Signed-off-by: Achim Leubner <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Documentation/scsi/aacraid.txt
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/linit.c

index ddace3a..30f643f 100644 (file)
@@ -60,17 +60,9 @@ Supported Cards/Chipsets
        9005:0285:9005:02d5     Adaptec ASR-2405 (Voodoo40 Lite)
        9005:0285:9005:02d6     Adaptec ASR-2445 (Voodoo44 Lite)
        9005:0285:9005:02d7     Adaptec ASR-2805 (Voodoo80 Lite)
-       9005:0285:9005:02d8     Adaptec 5405G (Voodoo40 PM)
-       9005:0285:9005:02d9     Adaptec 5445G (Voodoo44 PM)
-       9005:0285:9005:02da     Adaptec 5805G (Voodoo80 PM)
-       9005:0285:9005:02db     Adaptec 5085G (Voodoo08 PM)
-       9005:0285:9005:02dc     Adaptec 51245G (Voodoo124 PM)
-       9005:0285:9005:02dd     Adaptec 51645G (Voodoo164 PM)
-       9005:0285:9005:02de     Adaptec 52445G (Voodoo244 PM)
-       9005:0285:9005:02df     Adaptec ASR-2045G (Voodoo04 Lite PM)
-       9005:0285:9005:02e0     Adaptec ASR-2405G (Voodoo40 Lite PM)
-       9005:0285:9005:02e1     Adaptec ASR-2445G (Voodoo44 Lite PM)
-       9005:0285:9005:02e2     Adaptec ASR-2805G (Voodoo80 Lite PM)
+       9005:0285:9005:02d8     Adaptec 5405Z (Voodoo40 BLBU)
+       9005:0285:9005:02d9     Adaptec 5445Z (Voodoo44 BLBU)
+       9005:0285:9005:02da     Adaptec 5805Z (Voodoo80 BLBU)
        1011:0046:9005:0364     Adaptec 5400S (Mustang)
        1011:0046:9005:0365     Adaptec 5400S (Mustang)
        9005:0287:9005:0800     Adaptec Themisto (Jupiter)
@@ -140,6 +132,7 @@ Deanna Bonds                            (non-DASD support, PAE fibs and 64 bit,
                                         where fibs that go to the hardware are consistently called hw_fibs and
                                         not just fibs like the name of the driver tracking structure)
 Mark Salyzyn <Mark_Salyzyn@adaptec.com> Fixed panic issues and added some new product ids for upcoming hbas. Performance tuning, card failover and bug mitigations.
+Achim Leubner <Achim_Leubner@adaptec.com>
 
 Original Driver
 -------------------------
index 90d1d08..21964aa 100644 (file)
@@ -143,7 +143,7 @@ static char *aac_get_status_string(u32 status);
  */
 
 static int nondasd = -1;
-static int aac_cache;
+static int aac_cache = 2;      /* WCE=0 to avoid performance problems */
 static int dacmode = -1;
 int aac_msi;
 int aac_commit = -1;
@@ -157,7 +157,7 @@ module_param_named(cache, aac_cache, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(cache, "Disable Queue Flush commands:\n"
        "\tbit 0 - Disable FUA in WRITE SCSI commands\n"
        "\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
-       "\tbit 2 - Disable only if Battery not protecting Cache");
+       "\tbit 2 - Disable only if Battery is protecting Cache");
 module_param(dacmode, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC."
        " 0=off, 1=on");
@@ -217,6 +217,14 @@ int aac_reset_devices;
 module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
 
+int aac_wwn = 1;
+module_param_named(wwn, aac_wwn, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(wwn, "Select a WWN type for the arrays:\n"
+       "\t0 - Disable\n"
+       "\t1 - Array Meta Data Signature (default)\n"
+       "\t2 - Adapter Serial Number");
+
+
 static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
                struct fib *fibptr) {
        struct scsi_device *device;
@@ -1206,9 +1214,8 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 
 static int aac_scsi_32_64(struct fib * fib, struct scsi_cmnd * cmd)
 {
-       if ((sizeof(dma_addr_t) > 4) &&
-        (num_physpages > (0xFFFFFFFFULL >> PAGE_SHIFT)) &&
-        (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
+       if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac &&
+           (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
                return FAILED;
        return aac_scsi_32(fib, cmd);
 }
@@ -1371,8 +1378,11 @@ int aac_get_adapter_info(struct aac_dev* dev)
        if (dev->nondasd_support && !dev->in_reset)
                printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id);
 
+       if (dma_get_required_mask(&dev->pdev->dev) > DMA_32BIT_MASK)
+               dev->needs_dac = 1;
        dev->dac_support = 0;
-       if( (sizeof(dma_addr_t) > 4) && (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)){
+       if ((sizeof(dma_addr_t) > 4) && dev->needs_dac &&
+           (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) {
                if (!dev->in_reset)
                        printk(KERN_INFO "%s%d: 64bit support enabled.\n",
                                dev->name, dev->id);
@@ -1382,6 +1392,15 @@ int aac_get_adapter_info(struct aac_dev* dev)
        if(dacmode != -1) {
                dev->dac_support = (dacmode!=0);
        }
+
+       /* avoid problems with AAC_QUIRK_SCSI_32 controllers */
+       if (dev->dac_support && (aac_get_driver_ident(dev->cardtype)->quirks
+               & AAC_QUIRK_SCSI_32)) {
+               dev->nondasd_support = 0;
+               dev->jbod = 0;
+               expose_physicals = 0;
+       }
+
        if(dev->dac_support != 0) {
                if (!pci_set_dma_mask(dev->pdev, DMA_64BIT_MASK) &&
                        !pci_set_consistent_dma_mask(dev->pdev, DMA_64BIT_MASK)) {
@@ -2058,7 +2077,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", cid));
                memset(&inq_data, 0, sizeof (struct inquiry_data));
 
-               if (scsicmd->cmnd[1] & 0x1) {
+               if ((scsicmd->cmnd[1] & 0x1) && aac_wwn) {
                        char *arr = (char *)&inq_data;
 
                        /* EVPD bit set */
@@ -2081,7 +2100,12 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                                arr[1] = scsicmd->cmnd[2];
                                scsi_sg_copy_from_buffer(scsicmd, &inq_data,
                                                         sizeof(inq_data));
-                               return aac_get_container_serial(scsicmd);
+                               if (aac_wwn != 2)
+                                       return aac_get_container_serial(
+                                               scsicmd);
+                               /* SLES 10 SP1 special */
+                               scsicmd->result = DID_OK << 16 |
+                                 COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
                        } else {
                                /* vpd page not implemented */
                                scsicmd->result = DID_OK << 16 |
index 73916ad..cdbdec9 100644 (file)
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 2456
+# define AAC_DRIVER_BUILD 2461
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS 32
@@ -865,7 +865,11 @@ struct aac_supplement_adapter_info
        u8      MfgPcbaSerialNo[12];
        u8      MfgWWNName[8];
        __le32  SupportedOptions2;
-       __le32  ReservedGrowth[1];
+       __le32  StructExpansion;
+       /* StructExpansion == 1 */
+       __le32  FeatureBits3;
+       __le32  SupportedPerformanceModes;
+       __le32  ReservedForFutureGrowth[80];
 };
 #define AAC_FEATURE_FALCON     cpu_to_le32(0x00000010)
 #define AAC_FEATURE_JBOD       cpu_to_le32(0x08000000)
@@ -1020,6 +1024,7 @@ struct aac_dev
        u8                      jbod;
        u8                      cache_protected;
        u8                      dac_support;
+       u8                      needs_dac;
        u8                      raid_scsi_mode;
        u8                      comm_interface;
 #      define AAC_COMM_PRODUCER 0
index 1631044..d598eba 100644 (file)
@@ -54,6 +54,7 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
        const unsigned long printfbufsiz = 256;
        struct aac_init *init;
        dma_addr_t phys;
+       unsigned long aac_max_hostphysmempages;
 
        size = fibsize + sizeof(struct aac_init) + commsize + commalign + printfbufsiz;
 
@@ -90,7 +91,18 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
        init->AdapterFibsPhysicalAddress = cpu_to_le32((u32)phys);
        init->AdapterFibsSize = cpu_to_le32(fibsize);
        init->AdapterFibAlign = cpu_to_le32(sizeof(struct hw_fib));
-       init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
+       /*
+        * number of 4k pages of host physical memory. The aacraid fw needs
+        * this number to be less than 4gb worth of pages. New firmware doesn't
+        * have any issues with the mapping system, but older Firmware did, and
+        * had *troubles* dealing with the math overloading past 32 bits, thus
+        * we must limit this field.
+        */
+       aac_max_hostphysmempages = dma_get_required_mask(&dev->pdev->dev) >> 12;
+       if (aac_max_hostphysmempages < AAC_MAX_HOSTPHYSMEMPAGES)
+               init->HostPhysMemPages = cpu_to_le32(aac_max_hostphysmempages);
+       else
+               init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
 
        init->InitFlags = 0;
        if (dev->comm_interface == AAC_COMM_MESSAGE) {
index 36d8aab..c507719 100644 (file)
@@ -86,7 +86,13 @@ char aac_driver_version[] = AAC_DRIVER_FULL_VERSION;
  *
  * Note: The last field is used to index into aac_drivers below.
  */
-static struct pci_device_id aac_pci_tbl[] = {
+#ifdef DECLARE_PCI_DEVICE_TABLE
+static DECLARE_PCI_DEVICE_TABLE(aac_pci_tbl) = {
+#elif defined(__devinitconst)
+static const struct pci_device_id aac_pci_tbl[] __devinitconst = {
+#else
+static const struct pci_device_id aac_pci_tbl[] __devinitdata = {
+#endif
        { 0x1028, 0x0001, 0x1028, 0x0001, 0, 0, 0 }, /* PERC 2/Si (Iguana/PERC2Si) */
        { 0x1028, 0x0002, 0x1028, 0x0002, 0, 0, 1 }, /* PERC 3/Di (Opal/PERC3Di) */
        { 0x1028, 0x0003, 0x1028, 0x0003, 0, 0, 2 }, /* PERC 3/Si (SlimFast/PERC3Si */