sh: Kill off the remaining ST40 cruft.
[safe/jmp/linux-2.6] / drivers / scsi / aacraid / linit.c
index f8c2aaf..038980b 100644 (file)
@@ -221,12 +221,12 @@ static struct aac_driver_ident aac_drivers[] = {
        { aac_rx_init, "percraid", "DELL    ", "PERC 320/DC     ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Perc 320/DC*/
        { aac_sa_init, "aacraid",  "ADAPTEC ", "Adaptec 5400S   ", 4, AAC_QUIRK_34SG }, /* Adaptec 5400S (Mustang)*/
        { aac_sa_init, "aacraid",  "ADAPTEC ", "AAC-364         ", 4, AAC_QUIRK_34SG }, /* Adaptec 5400S (Mustang)*/
-       { aac_sa_init, "percraid", "DELL    ", "PERCRAID        ", 4, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Dell PERC2/QC */
+       { aac_sa_init, "percraid", "DELL    ", "PERCRAID        ", 4, AAC_QUIRK_34SG }, /* Dell PERC2/QC */
        { aac_sa_init, "hpnraid",  "HP      ", "NetRAID         ", 4, AAC_QUIRK_34SG }, /* HP NetRAID-4M */
 
        { aac_rx_init, "aacraid",  "DELL    ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Dell Catchall */
        { aac_rx_init, "aacraid",  "Legend  ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Legend Catchall */
-       { aac_rx_init, "aacraid",  "ADAPTEC ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Adaptec Catch All */
+       { aac_rx_init, "aacraid",  "ADAPTEC ", "RAID            ", 2 }, /* Adaptec Catch All */
        { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID            ", 2 }, /* Adaptec Rocket Catch All */
        { aac_nark_init, "aacraid", "ADAPTEC ", "RAID            ", 2 } /* Adaptec NEMER/ARK Catch All */
 };
@@ -636,6 +636,8 @@ static int aac_cfg_open(struct inode *inode, struct file *file)
 static int aac_cfg_ioctl(struct inode *inode,  struct file *file,
                unsigned int cmd, unsigned long arg)
 {
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
        return aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
 }
 
@@ -689,6 +691,8 @@ static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
 
 static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
        return aac_compat_do_ioctl((struct aac_dev *)file->private_data, cmd, arg);
 }
 #endif
@@ -770,15 +774,21 @@ static ssize_t aac_show_bios_version(struct class_device *class_dev,
        return len;
 }
 
-static ssize_t aac_show_serial_number(struct class_device *class_dev,
-               char *buf)
+ssize_t aac_show_serial_number(struct class_device *class_dev, char *buf)
 {
        struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
        int len = 0;
 
        if (le32_to_cpu(dev->adapter_info.serial[0]) != 0xBAD0)
-               len = snprintf(buf, PAGE_SIZE, "%x\n",
+               len = snprintf(buf, PAGE_SIZE, "%06X\n",
                  le32_to_cpu(dev->adapter_info.serial[0]));
+       if (len &&
+         !memcmp(&dev->supplement_adapter_info.MfgPcbaSerialNo[
+           sizeof(dev->supplement_adapter_info.MfgPcbaSerialNo)+2-len],
+         buf, len))
+               len = snprintf(buf, PAGE_SIZE, "%.*s\n",
+                 (int)sizeof(dev->supplement_adapter_info.MfgPcbaSerialNo),
+                 dev->supplement_adapter_info.MfgPcbaSerialNo);
        return len;
 }
 
@@ -816,7 +826,7 @@ static ssize_t aac_show_reset_adapter(struct class_device *class_dev,
        tmp = aac_adapter_check_health(dev);
        if ((tmp == 0) && dev->in_reset)
                tmp = -EBUSY;
-       len = snprintf(buf, PAGE_SIZE, "0x%x", tmp);
+       len = snprintf(buf, PAGE_SIZE, "0x%x\n", tmp);
        return len;
 }
 
@@ -934,9 +944,18 @@ static struct scsi_host_template aac_driver_template = {
        .cmd_per_lun                    = AAC_NUM_IO_FIB, 
 #endif 
        .use_clustering                 = ENABLE_CLUSTERING,
+       .use_sg_chaining                = ENABLE_SG_CHAINING,
        .emulated                       = 1,
 };
 
+static void __aac_shutdown(struct aac_dev * aac)
+{
+       kthread_stop(aac->thread);
+       aac_send_shutdown(aac);
+       aac_adapter_disable_int(aac);
+       free_irq(aac->pdev->irq, aac);
+}
+
 static int __devinit aac_probe_one(struct pci_dev *pdev,
                const struct pci_device_id *id)
 {
@@ -1089,13 +1108,12 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
        return 0;
 
  out_deinit:
-       kthread_stop(aac->thread);
-       aac_send_shutdown(aac);
-       aac_adapter_disable_int(aac);
-       free_irq(pdev->irq, aac);
+       __aac_shutdown(aac);
  out_unmap:
        aac_fib_map_free(aac);
-       pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys);
+       if (aac->comm_addr)
+               pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
+                 aac->comm_phys);
        kfree(aac->queues);
        aac_adapter_ioremap(aac, 0);
        kfree(aac->fibs);
@@ -1111,8 +1129,8 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
 static void aac_shutdown(struct pci_dev *dev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(dev);
-       struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
-       aac_send_shutdown(aac);
+       scsi_block_requests(shost);
+       __aac_shutdown((struct aac_dev *)shost->hostdata);
 }
 
 static void __devexit aac_remove_one(struct pci_dev *pdev)
@@ -1122,16 +1140,12 @@ static void __devexit aac_remove_one(struct pci_dev *pdev)
 
        scsi_remove_host(shost);
 
-       kthread_stop(aac->thread);
-
-       aac_send_shutdown(aac);
-       aac_adapter_disable_int(aac);
+       __aac_shutdown(aac);
        aac_fib_map_free(aac);
        pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
                        aac->comm_phys);
        kfree(aac->queues);
 
-       free_irq(pdev->irq, aac);
        aac_adapter_ioremap(aac, 0);
        
        kfree(aac->fibs);