]> err.no Git - linux-2.6/blobdiff - drivers/scsi/megaraid/megaraid_mbox.c
Merge branch 'linus' into timers/nohz
[linux-2.6] / drivers / scsi / megaraid / megaraid_mbox.c
index 9f041929aca52ee1d978c2652c995125798fa9ce..70a0f11f48b235d769b1efb088d1c9bd2c98f949 100644 (file)
@@ -125,7 +125,7 @@ static irqreturn_t megaraid_isr(int, void *);
 
 static void megaraid_mbox_dpc(unsigned long);
 
-static ssize_t megaraid_sysfs_show_app_hndl(struct class_device *, char *);
+static ssize_t megaraid_sysfs_show_app_hndl(struct device *, struct device_attribute *attr, char *);
 static ssize_t megaraid_sysfs_show_ldnum(struct device *, struct device_attribute *attr, char *);
 
 static int megaraid_cmm_register(adapter_t *);
@@ -313,12 +313,12 @@ static struct pci_driver megaraid_pci_driver = {
 // definitions for the device attributes for exporting logical drive number
 // for a scsi address (Host, Channel, Id, Lun)
 
-CLASS_DEVICE_ATTR(megaraid_mbox_app_hndl, S_IRUSR, megaraid_sysfs_show_app_hndl,
+DEVICE_ATTR(megaraid_mbox_app_hndl, S_IRUSR, megaraid_sysfs_show_app_hndl,
                NULL);
 
 // Host template initializer for megaraid mbox sysfs device attributes
-static struct class_device_attribute *megaraid_shost_attrs[] = {
-       &class_device_attr_megaraid_mbox_app_hndl,
+static struct device_attribute *megaraid_shost_attrs[] = {
+       &dev_attr_megaraid_mbox_app_hndl,
        NULL,
 };
 
@@ -3168,6 +3168,23 @@ megaraid_mbox_support_random_del(adapter_t *adapter)
        uint8_t         raw_mbox[sizeof(mbox_t)];
        int             rval;
 
+       /*
+        * Newer firmware on Dell CERC expect a different
+        * random deletion handling, so disable it.
+        */
+       if (adapter->pdev->vendor == PCI_VENDOR_ID_AMI &&
+           adapter->pdev->device == PCI_DEVICE_ID_AMI_MEGARAID3 &&
+           adapter->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
+           adapter->pdev->subsystem_device == PCI_SUBSYS_ID_CERC_ATA100_4CH &&
+           (adapter->fw_version[0] > '6' ||
+            (adapter->fw_version[0] == '6' &&
+             adapter->fw_version[2] > '6') ||
+            (adapter->fw_version[0] == '6'
+             && adapter->fw_version[2] == '6'
+             && adapter->fw_version[3] > '1'))) {
+               con_log(CL_DLEVEL1, ("megaraid: disable random deletion\n"));
+               return 0;
+       }
 
        mbox = (mbox_t *)raw_mbox;
 
@@ -4063,9 +4080,10 @@ megaraid_sysfs_get_ldmap(adapter_t *adapter)
  * handle, since we do not interface with applications directly.
  */
 static ssize_t
-megaraid_sysfs_show_app_hndl(struct class_device *cdev, char *buf)
+megaraid_sysfs_show_app_hndl(struct device *dev, struct device_attribute *attr,
+                            char *buf)
 {
-       struct Scsi_Host *shost = class_to_shost(cdev);
+       struct Scsi_Host *shost = class_to_shost(dev);
        adapter_t       *adapter = (adapter_t *)SCSIHOST2ADAP(shost);
        uint32_t        app_hndl;