tree-wide: fix assorted typos all over the place
[safe/jmp/linux-2.6] / drivers / scsi / megaraid / megaraid_mbox.c
index cbe4302..f9ae803 100644 (file)
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_mbox.c
- * Version     : v2.20.4.6 (Mar 07 2005)
+ * Version     : v2.20.5.1 (Nov 16 2006)
  *
  * Authors:
- *     Atul Mukker             <Atul.Mukker@lsil.com>
- *     Sreenivas Bagalkote     <Sreenivas.Bagalkote@lsil.com>
- *     Manoj Jose              <Manoj.Jose@lsil.com>
+ *     Atul Mukker             <Atul.Mukker@lsi.com>
+ *     Sreenivas Bagalkote     <Sreenivas.Bagalkote@lsi.com>
+ *     Manoj Jose              <Manoj.Jose@lsi.com>
+ *     Seokmann Ju
  *
  * List of supported controllers
  *
@@ -76,7 +77,7 @@ static void megaraid_exit(void);
 
 static int megaraid_probe_one(struct pci_dev*, const struct pci_device_id *);
 static void megaraid_detach_one(struct pci_dev *);
-static void megaraid_mbox_shutdown(struct device *);
+static void megaraid_mbox_shutdown(struct pci_dev *);
 
 static int megaraid_io_attach(adapter_t *);
 static void megaraid_io_detach(adapter_t *);
@@ -106,6 +107,7 @@ static int megaraid_mbox_support_random_del(adapter_t *);
 static int megaraid_mbox_get_max_sg(adapter_t *);
 static void megaraid_mbox_enum_raid_scsi(adapter_t *);
 static void megaraid_mbox_flush_cache(adapter_t *);
+static int megaraid_mbox_fire_sync_cmd(adapter_t *);
 
 static void megaraid_mbox_display_scb(adapter_t *, scb_t *);
 static void megaraid_mbox_setup_device_map(adapter_t *);
@@ -119,11 +121,11 @@ static void megaraid_mbox_prepare_pthru(adapter_t *, scb_t *,
 static void megaraid_mbox_prepare_epthru(adapter_t *, scb_t *,
                struct scsi_cmnd *);
 
-static irqreturn_t megaraid_isr(int, void *, struct pt_regs *);
+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 *);
@@ -136,7 +138,7 @@ static int wait_till_fw_empty(adapter_t *);
 
 
 
-MODULE_AUTHOR("LSI Logic Corporation");
+MODULE_AUTHOR("megaraidlinux@lsi.com");
 MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGARAID_VERSION);
@@ -145,7 +147,7 @@ MODULE_VERSION(MEGARAID_VERSION);
  * ### modules parameters for driver ###
  */
 
-/**
+/*
  * Set to enable driver to expose unconfigured disk to kernel
  */
 static int megaraid_expose_unconf_disks = 0;
@@ -153,7 +155,7 @@ module_param_named(unconf_disks, megaraid_expose_unconf_disks, int, 0);
 MODULE_PARM_DESC(unconf_disks,
        "Set to expose unconfigured disks to kernel (default=0)");
 
-/**
+/*
  * driver wait time if the adapter's mailbox is busy
  */
 static unsigned int max_mbox_busy_wait = MBOX_BUSY_WAIT;
@@ -161,7 +163,7 @@ module_param_named(busy_wait, max_mbox_busy_wait, int, 0);
 MODULE_PARM_DESC(busy_wait,
        "Max wait for mailbox in microseconds if busy (default=10)");
 
-/**
+/*
  * number of sectors per IO command
  */
 static unsigned int megaraid_max_sectors = MBOX_MAX_SECTORS;
@@ -169,7 +171,7 @@ module_param_named(max_sectors, megaraid_max_sectors, int, 0);
 MODULE_PARM_DESC(max_sectors,
        "Maximum number of sectors per IO command (default=128)");
 
-/**
+/*
  * number of commands per logical unit
  */
 static unsigned int megaraid_cmd_per_lun = MBOX_DEF_CMD_PER_LUN;
@@ -178,7 +180,7 @@ MODULE_PARM_DESC(cmd_per_lun,
        "Maximum number of commands per logical unit (default=64)");
 
 
-/**
+/*
  * Fast driver load option, skip scanning for physical devices during load.
  * This would result in non-disk devices being skipped during driver load
  * time. These can be later added though, using /proc/scsi/scsi
@@ -189,7 +191,7 @@ MODULE_PARM_DESC(fast_load,
        "Faster loading of the driver, skips physical devices! (default=0)");
 
 
-/**
+/*
  * mraid_debug level - threshold for amount of information to be displayed by
  * the driver. This level can be changed through modules parameters, ioctl or
  * sysfs/proc interface. By default, print the announcement messages only.
@@ -278,68 +280,14 @@ static struct pci_device_id pci_id_table_g[] =  {
        {
                PCI_VENDOR_ID_AMI,
                PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_QC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_DC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_SC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_AMI,
-               PCI_SUBSYS_ID_PERC3_SC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_AMI,
-               PCI_SUBSYS_ID_PERC3_DC,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_0,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_0,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_1,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_1,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_2,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_2,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_I4_133_RAID,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_I4_133_RAID,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_150_4,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_150_4,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_150_6,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_150_6,
+               PCI_DEVICE_ID_AMI_MEGARAID3,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
@@ -347,31 +295,17 @@ static struct pci_device_id pci_id_table_g[] =  {
                PCI_ANY_ID,
                PCI_ANY_ID,
        },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCS16,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCS16,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
-       },
        {0}     /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(pci, pci_id_table_g);
 
 
-static struct pci_driver megaraid_pci_driver_g = {
+static struct pci_driver megaraid_pci_driver = {
        .name           = "megaraid",
        .id_table       = pci_id_table_g,
        .probe          = megaraid_probe_one,
        .remove         = __devexit_p(megaraid_detach_one),
-       .driver         = {
-               .shutdown       = megaraid_mbox_shutdown,
-       }
+       .shutdown       = megaraid_mbox_shutdown,
 };
 
 
@@ -379,12 +313,12 @@ static struct pci_driver megaraid_pci_driver_g = {
 // 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,
 };
 
@@ -397,6 +331,21 @@ static struct device_attribute *megaraid_sdev_attrs[] = {
        NULL,
 };
 
+/**
+ * megaraid_change_queue_depth - Change the device's queue depth
+ * @sdev:      scsi device struct
+ * @qdepth:    depth to set
+ *
+ * Return value:
+ *     actual depth set
+ */
+static int megaraid_change_queue_depth(struct scsi_device *sdev, int qdepth)
+{
+       if (qdepth > MBOX_MAX_SCSI_CMDS)
+               qdepth = MBOX_MAX_SCSI_CMDS;
+       scsi_adjust_queue_depth(sdev, 0, qdepth);
+       return sdev->queue_depth;
+}
 
 /*
  * Scsi host template for megaraid unified driver
@@ -410,6 +359,7 @@ static struct scsi_host_template megaraid_template_g = {
        .eh_device_reset_handler        = megaraid_reset_handler,
        .eh_bus_reset_handler           = megaraid_reset_handler,
        .eh_host_reset_handler          = megaraid_reset_handler,
+       .change_queue_depth             = megaraid_change_queue_depth,
        .use_clustering                 = ENABLE_CLUSTERING,
        .sdev_attrs                     = megaraid_sdev_attrs,
        .shost_attrs                    = megaraid_shost_attrs,
@@ -420,8 +370,8 @@ static struct scsi_host_template megaraid_template_g = {
  * megaraid_init - module load hook
  *
  * We register ourselves as hotplug enabled module and let PCI subsystem
- * discover our adaters
- **/
+ * discover our adapters.
+ */
 static int __init
 megaraid_init(void)
 {
@@ -443,7 +393,7 @@ megaraid_init(void)
 
 
        // register as a PCI hot-plug driver module
-       rval = pci_register_driver(&megaraid_pci_driver_g);
+       rval = pci_register_driver(&megaraid_pci_driver);
        if (rval < 0) {
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: could not register hotplug support.\n"));
@@ -456,7 +406,7 @@ megaraid_init(void)
 /**
  * megaraid_exit - driver unload entry point
  *
- * We simply unwrap the megaraid_init routine here
+ * We simply unwrap the megaraid_init routine here.
  */
 static void __exit
 megaraid_exit(void)
@@ -464,7 +414,7 @@ megaraid_exit(void)
        con_log(CL_DLEVEL1, (KERN_NOTICE "megaraid: unloading framework\n"));
 
        // unregister as PCI hotplug driver
-       pci_unregister_driver(&megaraid_pci_driver_g);
+       pci_unregister_driver(&megaraid_pci_driver);
 
        return;
 }
@@ -472,12 +422,12 @@ megaraid_exit(void)
 
 /**
  * megaraid_probe_one - PCI hotplug entry point
- * @param pdev : handle to this controller's PCI configuration space
- * @param id   : pci device id of the class of controllers
+ * @pdev       : handle to this controller's PCI configuration space
+ * @id         : pci device id of the class of controllers
  *
  * This routine should be called whenever a new adapter is detected by the
- * PCI hotplug susbsytem.
- **/
+ * PCI hotplug susbsystem.
+ */
 static int __devinit
 megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
@@ -504,15 +454,14 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        pci_set_master(pdev);
 
        // Allocate the per driver initialization structure
-       adapter = kmalloc(sizeof(adapter_t), GFP_KERNEL);
+       adapter = kzalloc(sizeof(adapter_t), GFP_KERNEL);
 
        if (adapter == NULL) {
                con_log(CL_ANN, (KERN_WARNING
-               "megaraid: out of memory, %s %d.\n", __FUNCTION__, __LINE__));
+               "megaraid: out of memory, %s %d.\n", __func__, __LINE__));
 
                goto out_probe_one;
        }
-       memset(adapter, 0, sizeof(adapter_t));
 
 
        // set up PCI related soft state and other pre-known parameters
@@ -524,7 +473,7 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        // Setup the default DMA mask. This would be changed later on
        // depending on hardware capabilities
-       if (pci_set_dma_mask(adapter->pdev, DMA_32BIT_MASK) != 0) {
+       if (pci_set_dma_mask(adapter->pdev, DMA_BIT_MASK(32)) != 0) {
 
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: pci_set_dma_mask failed:%d\n", __LINE__));
@@ -535,8 +484,6 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        // Initialize the synchronization lock for kernel and LLD
        spin_lock_init(&adapter->lock);
-       adapter->host_lock = &adapter->lock;
-
 
        // Initialize the command queues: the list of free SCBs and the list
        // of pending SCBs.
@@ -595,16 +542,15 @@ out_probe_one:
 
 
 /**
- * megaraid_detach_one - release the framework resources and call LLD release
- * routine
- * @param pdev : handle for our PCI cofiguration space
+ * megaraid_detach_one - release framework resources and call LLD release routine
+ * @pdev       : handle for our PCI cofiguration space
  *
  * This routine is called during driver unload. We free all the allocated
  * resources and call the corresponding LLD so that it can also release all
  * its resources.
  *
- * This routine is also called from the PCI hotplug system
- **/
+ * This routine is also called from the PCI hotplug system.
+ */
 static void
 megaraid_detach_one(struct pci_dev *pdev)
 {
@@ -668,14 +614,14 @@ megaraid_detach_one(struct pci_dev *pdev)
 
 /**
  * megaraid_mbox_shutdown - PCI shutdown for megaraid HBA
- * @param device       : generice driver model device
+ * @pdev               : generic driver model device
  *
- * Shutdown notification, perform flush cache
+ * Shutdown notification, perform flush cache.
  */
 static void
-megaraid_mbox_shutdown(struct device *device)
+megaraid_mbox_shutdown(struct pci_dev *pdev)
 {
-       adapter_t               *adapter = pci_get_drvdata(to_pci_dev(device));
+       adapter_t               *adapter = pci_get_drvdata(pdev);
        static int              counter;
 
        if (!adapter) {
@@ -696,10 +642,10 @@ megaraid_mbox_shutdown(struct device *device)
 
 /**
  * megaraid_io_attach - attach a device with the IO subsystem
- * @param adapter      : controller's soft state
+ * @adapter            : controller's soft state
  *
- * Attach this device with the IO subsystem
- **/
+ * Attach this device with the IO subsystem.
+ */
 static int
 megaraid_io_attach(adapter_t *adapter)
 {
@@ -717,10 +663,6 @@ megaraid_io_attach(adapter_t *adapter)
        SCSIHOST2ADAP(host)     = (caddr_t)adapter;
        adapter->host           = host;
 
-       // export the parameters required by the mid-layer
-       scsi_assign_lock(host, adapter->host_lock);
-       scsi_set_device(host, &adapter->pdev->dev);
-
        host->irq               = adapter->irq;
        host->unique_id         = adapter->unique_id;
        host->can_queue         = adapter->max_cmds;
@@ -752,10 +694,10 @@ megaraid_io_attach(adapter_t *adapter)
 
 /**
  * megaraid_io_detach - detach a device from the IO subsystem
- * @param adapter      : controller's soft state
+ * @adapter            : controller's soft state
  *
- * Detach this device from the IO subsystem
- **/
+ * Detach this device from the IO subsystem.
+ */
 static void
 megaraid_io_detach(adapter_t *adapter)
 {
@@ -779,20 +721,21 @@ megaraid_io_detach(adapter_t *adapter)
 
 /**
  * megaraid_init_mbox - initialize controller
- * @param adapter      - our soft state
+ * @adapter            : our soft state
  *
- * . Allocate 16-byte aligned mailbox memory for firmware handshake
- * . Allocate controller's memory resources
- * . Find out all initialization data
- * . Allocate memory required for all the commands
- * . Use internal library of FW routines, build up complete soft state
+ * - Allocate 16-byte aligned mailbox memory for firmware handshake
+ * - Allocate controller's memory resources
+ * - Find out all initialization data
+ * - Allocate memory required for all the commands
+ * - Use internal library of FW routines, build up complete soft state
  */
-static int __init
+static int __devinit
 megaraid_init_mbox(adapter_t *adapter)
 {
        struct pci_dev          *pdev;
        mraid_device_t          *raid_dev;
        int                     i;
+       uint32_t                magic64;
 
 
        adapter->ito    = MBOX_TIMEOUT;
@@ -802,10 +745,9 @@ megaraid_init_mbox(adapter_t *adapter)
         * Allocate and initialize the init data structure for mailbox
         * controllers
         */
-       raid_dev = kmalloc(sizeof(mraid_device_t), GFP_KERNEL);
+       raid_dev = kzalloc(sizeof(mraid_device_t), GFP_KERNEL);
        if (raid_dev == NULL) return -1;
 
-       memset(raid_dev, 0, sizeof(mraid_device_t));
 
        /*
         * Attach the adapter soft state to raid device soft state
@@ -835,33 +777,39 @@ megaraid_init_mbox(adapter_t *adapter)
                goto out_release_regions;
        }
 
-       //
-       // Setup the rest of the soft state using the library of FW routines
-       //
+       /* initialize the mutual exclusion lock for the mailbox */
+       spin_lock_init(&raid_dev->mailbox_lock);
 
-       // request IRQ and register the interrupt service routine
-       if (request_irq(adapter->irq, megaraid_isr, SA_SHIRQ, "megaraid",
-               adapter)) {
+       /* allocate memory required for commands */
+       if (megaraid_alloc_cmd_packets(adapter) != 0)
+               goto out_iounmap;
 
-               con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: Couldn't register IRQ %d!\n", adapter->irq));
+       /*
+        * Issue SYNC cmd to flush the pending cmds in the adapter
+        * and initialize its internal state
+        */
 
-               goto out_iounmap;
-       }
+       if (megaraid_mbox_fire_sync_cmd(adapter))
+               con_log(CL_ANN, ("megaraid: sync cmd failed\n"));
 
+       /*
+        * Setup the rest of the soft state using the library of
+        * FW routines
+        */
 
-       // initialize the mutual exclusion lock for the mailbox
-       spin_lock_init(&raid_dev->mailbox_lock);
+       /* request IRQ and register the interrupt service routine */
+       if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid",
+               adapter)) {
+
+               con_log(CL_ANN, (KERN_WARNING
+                       "megaraid: Couldn't register IRQ %d!\n", adapter->irq));
+               goto out_alloc_cmds;
 
-       // allocate memory required for commands
-       if (megaraid_alloc_cmd_packets(adapter) != 0) {
-               goto out_free_irq;
        }
 
        // Product info
-       if (megaraid_mbox_product_info(adapter) != 0) {
-               goto out_alloc_cmds;
-       }
+       if (megaraid_mbox_product_info(adapter) != 0)
+               goto out_free_irq;
 
        // Do we support extended CDBs
        adapter->max_cdb_sz = 10;
@@ -930,18 +878,38 @@ megaraid_init_mbox(adapter_t *adapter)
         * Allocate resources required to issue FW calls, when sysfs is
         * accessed
         */
-       if (megaraid_sysfs_alloc_resources(adapter) != 0) {
-               goto out_alloc_cmds;
-       }
+       if (megaraid_sysfs_alloc_resources(adapter) != 0)
+               goto out_free_irq;
 
        // Set the DMA mask to 64-bit. All supported controllers as capable of
        // DMA in this range
-       if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) {
-
-               con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: could not set DMA mask for 64-bit.\n"));
+       pci_read_config_dword(adapter->pdev, PCI_CONF_AMISIG64, &magic64);
+
+       if (((magic64 == HBA_SIGNATURE_64_BIT) &&
+               ((adapter->pdev->subsystem_device !=
+               PCI_SUBSYS_ID_MEGARAID_SATA_150_6) &&
+               (adapter->pdev->subsystem_device !=
+               PCI_SUBSYS_ID_MEGARAID_SATA_150_4))) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+               adapter->pdev->device == PCI_DEVICE_ID_VERDE) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+               adapter->pdev->device == PCI_DEVICE_ID_DOBSON) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+               adapter->pdev->device == PCI_DEVICE_ID_LINDSAY) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_DELL &&
+               adapter->pdev->device == PCI_DEVICE_ID_PERC4_DI_EVERGLADES) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_DELL &&
+               adapter->pdev->device == PCI_DEVICE_ID_PERC4E_DI_KOBUK)) {
+               if (pci_set_dma_mask(adapter->pdev, DMA_BIT_MASK(64))) {
+                       con_log(CL_ANN, (KERN_WARNING
+                               "megaraid: DMA mask for 64-bit failed\n"));
 
-               goto out_free_sysfs_res;
+                       if (pci_set_dma_mask (adapter->pdev, DMA_BIT_MASK(32))) {
+                               con_log(CL_ANN, (KERN_WARNING
+                                       "megaraid: 32-bit DMA mask failed\n"));
+                               goto out_free_sysfs_res;
+                       }
+               }
        }
 
        // setup tasklet for DPC
@@ -955,10 +923,10 @@ megaraid_init_mbox(adapter_t *adapter)
 
 out_free_sysfs_res:
        megaraid_sysfs_free_resources(adapter);
-out_alloc_cmds:
-       megaraid_free_cmd_packets(adapter);
 out_free_irq:
        free_irq(adapter->irq, adapter);
+out_alloc_cmds:
+       megaraid_free_cmd_packets(adapter);
 out_iounmap:
        iounmap(raid_dev->baseaddr);
 out_release_regions:
@@ -972,7 +940,7 @@ out_free_raid_dev:
 
 /**
  * megaraid_fini_mbox - undo controller initialization
- * @param adapter      : our soft state
+ * @adapter            : our soft state
  */
 static void
 megaraid_fini_mbox(adapter_t *adapter)
@@ -1002,12 +970,12 @@ megaraid_fini_mbox(adapter_t *adapter)
 
 /**
  * megaraid_alloc_cmd_packets - allocate shared mailbox
- * @param adapter      : soft state of the raid controller
+ * @adapter            : soft state of the raid controller
  *
  * Allocate and align the shared mailbox. This maibox is used to issue
  * all the commands. For IO based controllers, the mailbox is also regsitered
  * with the FW. Allocate memory for all commands as well.
- * This is our big allocator
+ * This is our big allocator.
  */
 static int
 megaraid_alloc_cmd_packets(adapter_t *adapter)
@@ -1034,7 +1002,7 @@ megaraid_alloc_cmd_packets(adapter_t *adapter)
 
        if (!raid_dev->una_mbox64) {
                con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       "megaraid: out of memory, %s %d\n", __func__,
                        __LINE__));
                return -1;
        }
@@ -1062,7 +1030,7 @@ megaraid_alloc_cmd_packets(adapter_t *adapter)
        if (!adapter->ibuf) {
 
                con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       "megaraid: out of memory, %s %d\n", __func__,
                        __LINE__));
 
                goto out_free_common_mbox;
@@ -1080,21 +1048,19 @@ megaraid_alloc_cmd_packets(adapter_t *adapter)
         * since the calling routine does not yet know the number of available
         * commands.
         */
-       adapter->kscb_list = kmalloc(sizeof(scb_t) * MBOX_MAX_SCSI_CMDS,
-                       GFP_KERNEL);
+       adapter->kscb_list = kcalloc(MBOX_MAX_SCSI_CMDS, sizeof(scb_t), GFP_KERNEL);
 
        if (adapter->kscb_list == NULL) {
                con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       "megaraid: out of memory, %s %d\n", __func__,
                        __LINE__));
                goto out_free_ibuf;
        }
-       memset(adapter->kscb_list, 0, sizeof(scb_t) * MBOX_MAX_SCSI_CMDS);
 
        // memory allocation for our command packets
        if (megaraid_mbox_setup_dma_pools(adapter) != 0) {
                con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       "megaraid: out of memory, %s %d\n", __func__,
                        __LINE__));
                goto out_free_scb_list;
        }
@@ -1167,9 +1133,9 @@ out_free_common_mbox:
 
 /**
  * megaraid_free_cmd_packets - free memory
- * @param adapter      : soft state of the raid controller
+ * @adapter            : soft state of the raid controller
  *
- * Release memory resources allocated for commands
+ * Release memory resources allocated for commands.
  */
 static void
 megaraid_free_cmd_packets(adapter_t *adapter)
@@ -1191,10 +1157,10 @@ megaraid_free_cmd_packets(adapter_t *adapter)
 
 /**
  * megaraid_mbox_setup_dma_pools - setup dma pool for command packets
- * @param adapter      : HBA soft state
+ * @adapter            : HBA soft state
  *
- * setup the dma pools for mailbox, passthru and extended passthru structures,
- * and scatter-gather lists
+ * Setup the dma pools for mailbox, passthru and extended passthru structures,
+ * and scatter-gather lists.
  */
 static int
 megaraid_mbox_setup_dma_pools(adapter_t *adapter)
@@ -1287,10 +1253,10 @@ fail_setup_dma_pool:
 
 /**
  * megaraid_mbox_teardown_dma_pools - teardown dma pools for command packets
- * @param adapter      : HBA soft state
+ * @adapter            : HBA soft state
  *
- * teardown the dma pool for mailbox, passthru and extended passthru
- * structures, and scatter-gather lists
+ * Teardown the dma pool for mailbox, passthru and extended passthru
+ * structures, and scatter-gather lists.
  */
 static void
 megaraid_mbox_teardown_dma_pools(adapter_t *adapter)
@@ -1335,11 +1301,12 @@ megaraid_mbox_teardown_dma_pools(adapter_t *adapter)
 /**
  * megaraid_alloc_scb - detach and return a scb from the free list
  * @adapter    : controller's soft state
+ * @scp                : pointer to the scsi command to be executed
  *
- * return the scb from the head of the free list. NULL if there are none
- * available
- **/
-static inline scb_t *
+ * Return the scb from the head of the free list. %NULL if there are none
+ * available.
+ */
+static scb_t *
 megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp)
 {
        struct list_head        *head = &adapter->kscb_pool;
@@ -1372,11 +1339,11 @@ megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp)
  * @adapter    : controller's soft state
  * @scb                : scb to be freed
  *
- * return the scb back to the free list of scbs. The caller must 'flush' the
+ * Return the scb back to the free list of scbs. The caller must 'flush' the
  * SCB before calling us. E.g., performing pci_unamp and/or pci_sync etc.
  * NOTE NOTE: Make sure the scb is not on any list before calling this
  * routine.
- **/
+ */
 static inline void
 megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb)
 {
@@ -1397,18 +1364,16 @@ megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb)
 
 /**
  * megaraid_mbox_mksgl - make the scatter-gather list
- * @adapter    - controller's soft state
- * @scb                - scsi control block
+ * @adapter    : controller's soft state
+ * @scb                : scsi control block
  *
- * prepare the scatter-gather list
+ * Prepare the scatter-gather list.
  */
-static inline int
+static int
 megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
 {
        struct scatterlist      *sgl;
        mbox_ccb_t              *ccb;
-       struct page             *page;
-       unsigned long           offset;
        struct scsi_cmnd        *scp;
        int                     sgcnt;
        int                     i;
@@ -1417,48 +1382,16 @@ megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
        scp     = scb->scp;
        ccb     = (mbox_ccb_t *)scb->ccb;
 
+       sgcnt = scsi_dma_map(scp);
+       BUG_ON(sgcnt < 0 || sgcnt > adapter->sglen);
+
        // no mapping required if no data to be transferred
-       if (!scp->request_buffer || !scp->request_bufflen)
+       if (!sgcnt)
                return 0;
 
-       if (!scp->use_sg) {     /* scatter-gather list not used */
-
-               page = virt_to_page(scp->request_buffer);
-
-               offset = ((unsigned long)scp->request_buffer & ~PAGE_MASK);
-
-               ccb->buf_dma_h = pci_map_page(adapter->pdev, page, offset,
-                                                 scp->request_bufflen,
-                                                 scb->dma_direction);
-               scb->dma_type = MRAID_DMA_WBUF;
-
-               /*
-                * We need to handle special 64-bit commands that need a
-                * minimum of 1 SG
-                */
-               sgcnt = 1;
-               ccb->sgl64[0].address   = ccb->buf_dma_h;
-               ccb->sgl64[0].length    = scp->request_bufflen;
-
-               return sgcnt;
-       }
-
-       sgl = (struct scatterlist *)scp->request_buffer;
-
-       // The number of sg elements returned must not exceed our limit
-       sgcnt = pci_map_sg(adapter->pdev, sgl, scp->use_sg,
-                       scb->dma_direction);
-
-       if (sgcnt > adapter->sglen) {
-               con_log(CL_ANN, (KERN_CRIT
-                       "megaraid critical: too many sg elements:%d\n",
-                       sgcnt));
-               BUG();
-       }
-
        scb->dma_type = MRAID_DMA_WSG;
 
-       for (i = 0; i < sgcnt; i++, sgl++) {
+       scsi_for_each_sg(scp, sgl, sgcnt, i) {
                ccb->sgl64[i].address   = sg_dma_address(sgl);
                ccb->sgl64[i].length    = sg_dma_len(sgl);
        }
@@ -1470,12 +1403,12 @@ megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
 
 /**
  * mbox_post_cmd - issue a mailbox command
- * @adapter    - controller's soft state
- * @scb                - command to be issued
+ * @adapter    : controller's soft state
+ * @scb                : command to be issued
  *
- * post the command to the controller if mailbox is availble.
+ * Post the command to the controller if mailbox is available.
  */
-static inline int
+static int
 mbox_post_cmd(adapter_t *adapter, scb_t *scb)
 {
        mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
@@ -1518,19 +1451,11 @@ mbox_post_cmd(adapter_t *adapter, scb_t *scb)
 
        adapter->outstanding_cmds++;
 
-       if (scb->dma_direction == PCI_DMA_TODEVICE) {
-               if (!scb->scp->use_sg) {        // sg list not used
-                       pci_dma_sync_single_for_device(adapter->pdev,
-                                       ccb->buf_dma_h,
-                                       scb->scp->request_bufflen,
-                                       PCI_DMA_TODEVICE);
-               }
-               else {
-                       pci_dma_sync_sg_for_device(adapter->pdev,
-                               scb->scp->request_buffer,
-                               scb->scp->use_sg, PCI_DMA_TODEVICE);
-               }
-       }
+       if (scb->dma_direction == PCI_DMA_TODEVICE)
+               pci_dma_sync_sg_for_device(adapter->pdev,
+                                          scsi_sglist(scb->scp),
+                                          scsi_sg_count(scb->scp),
+                                          PCI_DMA_TODEVICE);
 
        mbox->busy      = 1;    // Set busy
        mbox->poll      = 0;
@@ -1553,7 +1478,7 @@ mbox_post_cmd(adapter_t *adapter, scb_t *scb)
  * Queue entry point for mailbox based controllers.
  */
 static int
-megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
+megaraid_queue_command(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *))
 {
        adapter_t       *adapter;
        scb_t           *scb;
@@ -1563,10 +1488,6 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
        scp->scsi_done  = done;
        scp->result     = 0;
 
-       assert_spin_locked(adapter->host_lock);
-
-       spin_unlock(adapter->host_lock);
-
        /*
         * Allocate and build a SCB request
         * if_busy flag will be set if megaraid_mbox_build_cmd() command could
@@ -1576,33 +1497,26 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
         * return 0 in that case, and we would do the callback right away.
         */
        if_busy = 0;
-       scb     = megaraid_mbox_build_cmd(adapter, scp, &if_busy);
-
-       if (scb) {
-               megaraid_mbox_runpendq(adapter, scb);
-       }
-
-       spin_lock(adapter->host_lock);
-
+       scb = megaraid_mbox_build_cmd(adapter, scp, &if_busy);
        if (!scb) {     // command already completed
                done(scp);
                return 0;
        }
 
+       megaraid_mbox_runpendq(adapter, scb);
        return if_busy;
 }
 
-
 /**
- * megaraid_mbox_build_cmd - transform the mid-layer scsi command to megaraid
- * firmware lingua
- * @adapter    - controller's soft state
- * @scp                - mid-layer scsi command pointer
- * @busy       - set if request could not be completed because of lack of
+ * megaraid_mbox_build_cmd - transform the mid-layer scsi commands
+ * @adapter    : controller's soft state
+ * @scp                : mid-layer scsi command pointer
+ * @busy       : set if request could not be completed because of lack of
  *             resources
  *
- * convert the command issued by mid-layer to format understood by megaraid
- * firmware. We also complete certain command without sending them to firmware
+ * Transform the mid-layer scsi command to megaraid firmware lingua.
+ * Convert the command issued by mid-layer to format understood by megaraid
+ * firmware. We also complete certain commands without sending them to firmware.
  */
 static scb_t *
 megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
@@ -1664,29 +1578,24 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
                        return scb;
 
                case MODE_SENSE:
-                       if (scp->use_sg) {
-                               struct scatterlist      *sgl;
-                               caddr_t                 vaddr;
+               {
+                       struct scatterlist      *sgl;
+                       caddr_t                 vaddr;
 
-                               sgl = (struct scatterlist *)scp->request_buffer;
-                               if (sgl->page) {
-                                       vaddr = (caddr_t)
-                                               (page_address((&sgl[0])->page)
-                                               + (&sgl[0])->offset);
+                       sgl = scsi_sglist(scp);
+                       if (sg_page(sgl)) {
+                               vaddr = (caddr_t) sg_virt(&sgl[0]);
 
-                                       memset(vaddr, 0, scp->cmnd[4]);
-                               }
-                               else {
-                                       con_log(CL_ANN, (KERN_WARNING
-                                       "megaraid mailbox: invalid sg:%d\n",
-                                       __LINE__));
-                               }
+                               memset(vaddr, 0, scp->cmnd[4]);
                        }
                        else {
-                               memset(scp->request_buffer, 0, scp->cmnd[4]);
+                               con_log(CL_ANN, (KERN_WARNING
+                                                "megaraid mailbox: invalid sg:%d\n",
+                                                __LINE__));
                        }
-                       scp->result = (DID_OK << 16);
-                       return NULL;
+               }
+               scp->result = (DID_OK << 16);
+               return NULL;
 
                case INQUIRY:
                        /*
@@ -1706,6 +1615,14 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
                                rdev->last_disp |= (1L << SCP2CHANNEL(scp));
                        }
 
+                       if (scp->cmnd[1] & MEGA_SCSI_INQ_EVPD) {
+                               scp->sense_buffer[0] = 0x70;
+                               scp->sense_buffer[2] = ILLEGAL_REQUEST;
+                               scp->sense_buffer[12] = MEGA_INVALID_FIELD_IN_CDB;
+                               scp->result = CHECK_CONDITION << 1;
+                               return NULL;
+                       }
+
                        /* Fall through */
 
                case READ_CAPACITY:
@@ -1748,7 +1665,7 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
                        mbox->cmd               = MBOXCMD_PASSTHRU64;
                        scb->dma_direction      = scp->sc_data_direction;
 
-                       pthru->dataxferlen      = scp->request_bufflen;
+                       pthru->dataxferlen      = scsi_bufflen(scp);
                        pthru->dataxferaddr     = ccb->sgl_dma_h;
                        pthru->numsge           = megaraid_mbox_mksgl(adapter,
                                                        scb);
@@ -1975,9 +1892,9 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
 /**
  * megaraid_mbox_runpendq - execute commands queued in the pending queue
  * @adapter    : controller's soft state
- * @scb                : SCB to be queued in the pending list
+ * @scb_q      : SCB to be queued in the pending list
  *
- * scan the pending list for commands which are not yet issued and try to
+ * Scan the pending list for commands which are not yet issued and try to
  * post to the controller. The SCB can be a null pointer, which would indicate
  * no SCB to be queue, just try to execute the ones in the pending list.
  *
@@ -2050,11 +1967,11 @@ megaraid_mbox_runpendq(adapter_t *adapter, scb_t *scb_q)
 
 /**
  * megaraid_mbox_prepare_pthru - prepare a command for physical devices
- * @adapter    - pointer to controller's soft state
- * @scb                - scsi control block
- * @scp                - scsi command from the mid-layer
+ * @adapter    : pointer to controller's soft state
+ * @scb                : scsi control block
+ * @scp                : scsi command from the mid-layer
  *
- * prepare a command for the scsi physical devices
+ * Prepare a command for the scsi physical devices.
  */
 static void
 megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb,
@@ -2082,8 +1999,8 @@ megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb,
 
        memcpy(pthru->cdb, scp->cmnd, scp->cmd_len);
 
-       if (scp->request_bufflen) {
-               pthru->dataxferlen      = scp->request_bufflen;
+       if (scsi_bufflen(scp)) {
+               pthru->dataxferlen      = scsi_bufflen(scp);
                pthru->dataxferaddr     = ccb->sgl_dma_h;
                pthru->numsge           = megaraid_mbox_mksgl(adapter, scb);
        }
@@ -2098,12 +2015,12 @@ megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb,
 
 /**
  * megaraid_mbox_prepare_epthru - prepare a command for physical devices
- * @adapter    - pointer to controller's soft state
- * @scb                - scsi control block
- * @scp                - scsi command from the mid-layer
+ * @adapter    : pointer to controller's soft state
+ * @scb                : scsi control block
+ * @scp                : scsi command from the mid-layer
  *
- * prepare a command for the scsi physical devices. This rountine prepares
- * commands for devices which can take extended CDBs (>10 bytes)
+ * Prepare a command for the scsi physical devices. This rountine prepares
+ * commands for devices which can take extended CDBs (>10 bytes).
  */
 static void
 megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
@@ -2131,8 +2048,8 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
 
        memcpy(epthru->cdb, scp->cmnd, scp->cmd_len);
 
-       if (scp->request_bufflen) {
-               epthru->dataxferlen     = scp->request_bufflen;
+       if (scsi_bufflen(scp)) {
+               epthru->dataxferlen     = scsi_bufflen(scp);
                epthru->dataxferaddr    = ccb->sgl_dma_h;
                epthru->numsge          = megaraid_mbox_mksgl(adapter, scb);
        }
@@ -2147,14 +2064,14 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
 
 /**
  * megaraid_ack_sequence - interrupt ack sequence for memory mapped HBAs
- * @adapter    - controller's soft state
+ * @adapter    : controller's soft state
  *
- * Interrupt ackrowledgement sequence for memory mapped HBAs. Find out the
+ * Interrupt acknowledgement sequence for memory mapped HBAs. Find out the
  * completed command and put them on the completed list for later processing.
  *
  * Returns:    1 if the interrupt is valid, 0 otherwise
  */
-static inline int
+static int
 megaraid_ack_sequence(adapter_t *adapter)
 {
        mraid_device_t          *raid_dev = ADAP2RAIDDEV(adapter);
@@ -2262,14 +2179,13 @@ megaraid_ack_sequence(adapter_t *adapter)
 
 /**
  * megaraid_isr - isr for memory based mailbox based controllers
- * @irq                - irq
- * @devp       - pointer to our soft state
- * @regs       - unused
+ * @irq                : irq
+ * @devp       : pointer to our soft state
  *
  * Interrupt service routine for memory-mapped mailbox controllers.
  */
 static irqreturn_t
-megaraid_isr(int irq, void *devp, struct pt_regs *regs)
+megaraid_isr(int irq, void *devp)
 {
        adapter_t       *adapter = devp;
        int             handled;
@@ -2292,44 +2208,20 @@ megaraid_isr(int irq, void *devp, struct pt_regs *regs)
  *
  * DMA sync if required.
  */
-static inline void
+static void
 megaraid_mbox_sync_scb(adapter_t *adapter, scb_t *scb)
 {
        mbox_ccb_t      *ccb;
 
        ccb     = (mbox_ccb_t *)scb->ccb;
 
-       switch (scb->dma_type) {
-
-       case MRAID_DMA_WBUF:
-               if (scb->dma_direction == PCI_DMA_FROMDEVICE) {
-                       pci_dma_sync_single_for_cpu(adapter->pdev,
-                                       ccb->buf_dma_h,
-                                       scb->scp->request_bufflen,
+       if (scb->dma_direction == PCI_DMA_FROMDEVICE)
+               pci_dma_sync_sg_for_cpu(adapter->pdev,
+                                       scsi_sglist(scb->scp),
+                                       scsi_sg_count(scb->scp),
                                        PCI_DMA_FROMDEVICE);
-               }
-
-               pci_unmap_page(adapter->pdev, ccb->buf_dma_h,
-                       scb->scp->request_bufflen, scb->dma_direction);
-
-               break;
-
-       case MRAID_DMA_WSG:
-               if (scb->dma_direction == PCI_DMA_FROMDEVICE) {
-                       pci_dma_sync_sg_for_cpu(adapter->pdev,
-                                       scb->scp->request_buffer,
-                                       scb->scp->use_sg, PCI_DMA_FROMDEVICE);
-               }
-
-               pci_unmap_sg(adapter->pdev, scb->scp->request_buffer,
-                       scb->scp->use_sg, scb->dma_direction);
-
-               break;
-
-       default:
-               break;
-       }
 
+       scsi_dma_unmap(scb->scp);
        return;
 }
 
@@ -2362,6 +2254,7 @@ megaraid_mbox_dpc(unsigned long devp)
        unsigned long           flags;
        uint8_t                 c;
        int                     status;
+       uioc_t                  *kioc;
 
 
        if (!adapter) return;
@@ -2404,6 +2297,9 @@ megaraid_mbox_dpc(unsigned long devp)
                        // remove from local clist
                        list_del_init(&scb->list);
 
+                       kioc                    = (uioc_t *)scb->gp;
+                       kioc->status            = 0;
+
                        megaraid_mbox_mm_done(adapter, scb);
 
                        continue;
@@ -2428,24 +2324,14 @@ megaraid_mbox_dpc(unsigned long devp)
                if (scp->cmnd[0] == INQUIRY && status == 0 && islogical == 0
                                && IS_RAID_CH(raid_dev, scb->dev_channel)) {
 
-                       if (scp->use_sg) {
-                               sgl = (struct scatterlist *)
-                                       scp->request_buffer;
-
-                               if (sgl->page) {
-                                       c = *(unsigned char *)
-                                       (page_address((&sgl[0])->page) +
-                                               (&sgl[0])->offset);
-                               }
-                               else {
-                                       con_log(CL_ANN, (KERN_WARNING
-                                       "megaraid mailbox: invalid sg:%d\n",
-                                       __LINE__));
-                                       c = 0;
-                               }
-                       }
-                       else {
-                               c = *(uint8_t *)scp->request_buffer;
+                       sgl = scsi_sglist(scp);
+                       if (sg_page(sgl)) {
+                               c = *(unsigned char *) sg_virt(&sgl[0]);
+                       } else {
+                               con_log(CL_ANN, (KERN_WARNING
+                                                "megaraid mailbox: invalid sg:%d\n",
+                                                __LINE__));
+                               c = 0;
                        }
 
                        if ((c & 0x1F ) == TYPE_DISK) {
@@ -2549,9 +2435,7 @@ megaraid_mbox_dpc(unsigned long devp)
                megaraid_dealloc_scb(adapter, scb);
 
                // send the scsi packet back to kernel
-               spin_lock(adapter->host_lock);
                scp->scsi_done(scp);
-               spin_unlock(adapter->host_lock);
        }
 
        return;
@@ -2566,7 +2450,7 @@ megaraid_mbox_dpc(unsigned long devp)
  * aborted. All the commands issued to the F/W must complete.
  **/
 static int
-__megaraid_abort_handler(struct scsi_cmnd *scp)
+megaraid_abort_handler(struct scsi_cmnd *scp)
 {
        adapter_t               *adapter;
        mraid_device_t          *raid_dev;
@@ -2580,8 +2464,6 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        adapter         = SCP2ADAPTER(scp);
        raid_dev        = ADAP2RAIDDEV(adapter);
 
-       assert_spin_locked(adapter->host_lock);
-
        con_log(CL_ANN, (KERN_WARNING
                "megaraid: aborting-%ld cmd=%x <c=%d t=%d l=%d>\n",
                scp->serial_number, scp->cmnd[0], SCP2CHANNEL(scp),
@@ -2661,6 +2543,7 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        // traverse through the list of all SCB, since driver does not
        // maintain these SCBs on any list
        found = 0;
+       spin_lock_irq(&adapter->lock);
        for (i = 0; i < MBOX_MAX_SCSI_CMDS; i++) {
                scb = adapter->kscb_list + i;
 
@@ -2683,6 +2566,7 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
                        }
                }
        }
+       spin_unlock_irq(&adapter->lock);
 
        if (!found) {
                con_log(CL_ANN, (KERN_WARNING
@@ -2699,22 +2583,6 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        return FAILED;
 }
 
-static int
-megaraid_abort_handler(struct scsi_cmnd *scp)
-{
-       adapter_t       *adapter;
-       int rc;
-
-       adapter         = SCP2ADAPTER(scp);
-
-       spin_lock_irq(adapter->host_lock);
-       rc = __megaraid_abort_handler(scp);
-       spin_unlock_irq(adapter->host_lock);
-
-       return rc;
-}
-
-
 /**
  * megaraid_reset_handler - device reset hadler for mailbox based driver
  * @scp                : reference command
@@ -2723,10 +2591,10 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
  * the FW is still live, in which case the outstanding commands counter mut go
  * down to 0. If that happens, also issue the reservation reset command to
  * relinquish (possible) reservations on the logical drives connected to this
- * host
+ * host.
  **/
 static int
-__megaraid_reset_handler(struct scsi_cmnd *scp)
+megaraid_reset_handler(struct scsi_cmnd *scp)
 {
        adapter_t       *adapter;
        scb_t           *scb;
@@ -2738,14 +2606,11 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
        int             recovery_window;
        int             recovering;
        int             i;
+       uioc_t          *kioc;
 
        adapter         = SCP2ADAPTER(scp);
        raid_dev        = ADAP2RAIDDEV(adapter);
 
-       assert_spin_locked(adapter->host_lock);
-
-       con_log(CL_ANN, (KERN_WARNING "megaraid: reseting the host...\n"));
-
        // return failure if adapter is not responding
        if (raid_dev->hw_error) {
                con_log(CL_ANN, (KERN_NOTICE
@@ -2761,34 +2626,51 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
        // Also, reset all the commands currently owned by the driver
        spin_lock_irqsave(PENDING_LIST_LOCK(adapter), flags);
        list_for_each_entry_safe(scb, tmp, &adapter->pend_list, list) {
-
                list_del_init(&scb->list);      // from pending list
 
-               con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: %ld:%d[%d:%d], reset from pending list\n",
-                               scp->serial_number, scb->sno,
-                               scb->dev_channel, scb->dev_target));
+               if (scb->sno >= MBOX_MAX_SCSI_CMDS) {
+                       con_log(CL_ANN, (KERN_WARNING
+                       "megaraid: IOCTL packet with %d[%d:%d] being reset\n",
+                       scb->sno, scb->dev_channel, scb->dev_target));
 
-               scp->result = (DID_RESET << 16);
-               scp->scsi_done(scp);
+                       scb->status = -1;
 
-               megaraid_dealloc_scb(adapter, scb);
+                       kioc                    = (uioc_t *)scb->gp;
+                       kioc->status            = -EFAULT;
+
+                       megaraid_mbox_mm_done(adapter, scb);
+               } else {
+                       if (scb->scp == scp) {  // Found command
+                               con_log(CL_ANN, (KERN_WARNING
+                                       "megaraid: %ld:%d[%d:%d], reset from pending list\n",
+                                       scp->serial_number, scb->sno,
+                                       scb->dev_channel, scb->dev_target));
+                       } else {
+                               con_log(CL_ANN, (KERN_WARNING
+                               "megaraid: IO packet with %d[%d:%d] being reset\n",
+                               scb->sno, scb->dev_channel, scb->dev_target));
+                       }
+
+                       scb->scp->result = (DID_RESET << 16);
+                       scb->scp->scsi_done(scb->scp);
+
+                       megaraid_dealloc_scb(adapter, scb);
+               }
        }
        spin_unlock_irqrestore(PENDING_LIST_LOCK(adapter), flags);
 
        if (adapter->outstanding_cmds) {
                con_log(CL_ANN, (KERN_NOTICE
                        "megaraid: %d outstanding commands. Max wait %d sec\n",
-                       adapter->outstanding_cmds, MBOX_RESET_WAIT));
+                       adapter->outstanding_cmds,
+                       (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT)));
        }
 
-       spin_unlock(adapter->host_lock);
-
        recovery_window = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
 
        recovering = adapter->outstanding_cmds;
 
-       for (i = 0; i < recovery_window && adapter->outstanding_cmds; i++) {
+       for (i = 0; i < recovery_window; i++) {
 
                megaraid_ack_sequence(adapter);
 
@@ -2797,19 +2679,18 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
                        con_log(CL_ANN, (
                        "megaraid mbox: Wait for %d commands to complete:%d\n",
                                adapter->outstanding_cmds,
-                               MBOX_RESET_WAIT - i));
+                               (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT) - i));
                }
 
                // bailout if no recovery happended in reset time
-               if ((i == MBOX_RESET_WAIT) &&
-                       (recovering == adapter->outstanding_cmds)) {
+               if (adapter->outstanding_cmds == 0) {
                        break;
                }
 
                msleep(1000);
        }
 
-       spin_lock(adapter->host_lock);
+       spin_lock(&adapter->lock);
 
        // If still outstanding commands, bail out
        if (adapter->outstanding_cmds) {
@@ -2818,16 +2699,20 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
 
                raid_dev->hw_error = 1;
 
-               return FAILED;
+               rval = FAILED;
+               goto out;
        }
        else {
                con_log(CL_ANN, (KERN_NOTICE
-               "megaraid mbox: reset sequence completed sucessfully\n"));
+               "megaraid mbox: reset sequence completed successfully\n"));
        }
 
 
        // If the controller supports clustering, reset reservations
-       if (!adapter->ha) return SUCCESS;
+       if (!adapter->ha) {
+               rval = SUCCESS;
+               goto out;
+       }
 
        // clear reservations if any
        raw_mbox[0] = CLUSTER_CMD;
@@ -2844,22 +2729,11 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
                                "megaraid: reservation reset failed\n"));
        }
 
+ out:
+       spin_unlock_irq(&adapter->lock);
        return rval;
 }
 
-static int
-megaraid_reset_handler(struct scsi_cmnd *cmd)
-{
-       int rc;
-
-       spin_lock_irq(cmd->device->host->host_lock);
-       rc = __megaraid_reset_handler(cmd);
-       spin_unlock_irq(cmd->device->host->host_lock);
-
-       return rc;
-}
-
-
 /*
  * START: internal commands library
  *
@@ -2869,11 +2743,11 @@ megaraid_reset_handler(struct scsi_cmnd *cmd)
 
 /**
  * mbox_post_sync_cmd() - blocking command to the mailbox based controllers
- * @adapter    - controller's soft state
- * @raw_mbox   - the mailbox
+ * @adapter    : controller's soft state
+ * @raw_mbox   : the mailbox
  *
  * Issue a scb in synchronous and non-interrupt mode for mailbox based
- * controllers
+ * controllers.
  */
 static int
 mbox_post_sync_cmd(adapter_t *adapter, uint8_t raw_mbox[])
@@ -2912,7 +2786,7 @@ mbox_post_sync_cmd(adapter_t *adapter, uint8_t raw_mbox[])
        // available within 1 second, assume FW is initializing and wait
        // for an extended amount of time
        if (mbox->numstatus == 0xFF) {  // status not yet available
-               udelay(25);;
+               udelay(25);
 
                for (i = 0; mbox->numstatus == 0xFF && i < 1000; i++) {
                        rmb();
@@ -3001,12 +2875,12 @@ blocked_mailbox:
 
 /**
  * mbox_post_sync_cmd_fast - blocking command to the mailbox based controllers
- * @adapter    - controller's soft state
- * @raw_mbox   - the mailbox
+ * @adapter    : controller's soft state
+ * @raw_mbox   : the mailbox
  *
  * Issue a scb in synchronous and non-interrupt mode for mailbox based
  * controllers. This is a faster version of the synchronous command and
- * therefore can be called in interrupt-context as well
+ * therefore can be called in interrupt-context as well.
  */
 static int
 mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[])
@@ -3033,11 +2907,13 @@ mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[])
        wmb();
        WRINDOOR(raid_dev, raid_dev->mbox_dma | 0x1);
 
-       for (i = 0; i < 0xFFFFF; i++) {
+       for (i = 0; i < MBOX_SYNC_WAIT_CNT; i++) {
                if (mbox->numstatus != 0xFF) break;
+               rmb();
+               udelay(MBOX_SYNC_DELAY_200);
        }
 
-       if (i == 0xFFFFF) {
+       if (i == MBOX_SYNC_WAIT_CNT) {
                // We may need to re-calibrate the counter
                con_log(CL_ANN, (KERN_CRIT
                        "megaraid: fast sync command timed out\n"));
@@ -3052,10 +2928,10 @@ mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[])
 
 /**
  * megaraid_busywait_mbox() - Wait until the controller's mailbox is available
- * @raid_dev   - RAID device (HBA) soft state
+ * @raid_dev   : RAID device (HBA) soft state
  *
- * wait until the controller's mailbox is available to accept more commands.
- * wait for at most 1 second
+ * Wait until the controller's mailbox is available to accept more commands.
+ * Wait for at most 1 second.
  */
 static int
 megaraid_busywait_mbox(mraid_device_t *raid_dev)
@@ -3076,9 +2952,9 @@ megaraid_busywait_mbox(mraid_device_t *raid_dev)
 
 /**
  * megaraid_mbox_product_info - some static information about the controller
- * @adapter    - our soft state
+ * @adapter    : our soft state
  *
- * issue commands to the controller to grab some parameters required by our
+ * Issue commands to the controller to grab some parameters required by our
  * caller.
  */
 static int
@@ -3105,7 +2981,7 @@ megaraid_mbox_product_info(adapter_t *adapter)
 
        if (pinfo == NULL) {
                con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       "megaraid: out of memory, %s %d\n", __func__,
                        __LINE__));
 
                return -1;
@@ -3201,10 +3077,10 @@ megaraid_mbox_product_info(adapter_t *adapter)
 
 /**
  * megaraid_mbox_extended_cdb - check for support for extended CDBs
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
- * this routine check whether the controller in question supports extended
- * ( > 10 bytes ) CDBs
+ * This routine check whether the controller in question supports extended
+ * ( > 10 bytes ) CDBs.
  */
 static int
 megaraid_mbox_extended_cdb(adapter_t *adapter)
@@ -3237,8 +3113,8 @@ megaraid_mbox_extended_cdb(adapter_t *adapter)
 
 /**
  * megaraid_mbox_support_ha - Do we support clustering
- * @adapter    - soft state for the controller
- * @init_id    - ID of the initiator
+ * @adapter    : soft state for the controller
+ * @init_id    : ID of the initiator
  *
  * Determine if the firmware supports clustering and the ID of the initiator.
  */
@@ -3280,9 +3156,9 @@ megaraid_mbox_support_ha(adapter_t *adapter, uint16_t *init_id)
 
 /**
  * megaraid_mbox_support_random_del - Do we support random deletion
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
- * Determine if the firmware supports random deletion
+ * Determine if the firmware supports random deletion.
  * Return:     1 is operation supported, 0 otherwise
  */
 static int
@@ -3292,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;
 
@@ -3315,10 +3208,10 @@ megaraid_mbox_support_random_del(adapter_t *adapter)
 
 /**
  * megaraid_mbox_get_max_sg - maximum sg elements supported by the firmware
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
  * Find out the maximum number of scatter-gather elements supported by the
- * firmware
+ * firmware.
  */
 static int
 megaraid_mbox_get_max_sg(adapter_t *adapter)
@@ -3355,10 +3248,10 @@ megaraid_mbox_get_max_sg(adapter_t *adapter)
 
 /**
  * megaraid_mbox_enum_raid_scsi - enumerate the RAID and SCSI channels
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
- * Enumerate the RAID and SCSI channels for ROMB platoforms so that channels
- * can be exported as regular SCSI channels
+ * Enumerate the RAID and SCSI channels for ROMB platforms so that channels
+ * can be exported as regular SCSI channels.
  */
 static void
 megaraid_mbox_enum_raid_scsi(adapter_t *adapter)
@@ -3392,9 +3285,9 @@ megaraid_mbox_enum_raid_scsi(adapter_t *adapter)
 
 /**
  * megaraid_mbox_flush_cache - flush adapter and disks cache
- * @param adapter      : soft state for the controller
+ * @adapter            : soft state for the controller
  *
- * Flush adapter cache followed by disks cache
+ * Flush adapter cache followed by disks cache.
  */
 static void
 megaraid_mbox_flush_cache(adapter_t *adapter)
@@ -3424,13 +3317,91 @@ megaraid_mbox_flush_cache(adapter_t *adapter)
 
 
 /**
+ * megaraid_mbox_fire_sync_cmd - fire the sync cmd
+ * @adapter            : soft state for the controller
+ *
+ * Clears the pending cmds in FW and reinits its RAID structs.
+ */
+static int
+megaraid_mbox_fire_sync_cmd(adapter_t *adapter)
+{
+       mbox_t  *mbox;
+       uint8_t raw_mbox[sizeof(mbox_t)];
+       mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
+       mbox64_t *mbox64;
+       int     status = 0;
+       int i;
+       uint32_t dword;
+
+       mbox = (mbox_t *)raw_mbox;
+
+       memset((caddr_t)raw_mbox, 0, sizeof(mbox_t));
+
+       raw_mbox[0] = 0xFF;
+
+       mbox64  = raid_dev->mbox64;
+       mbox    = raid_dev->mbox;
+
+       /* Wait until mailbox is free */
+       if (megaraid_busywait_mbox(raid_dev) != 0) {
+               status = 1;
+               goto blocked_mailbox;
+       }
+
+       /* Copy mailbox data into host structure */
+       memcpy((caddr_t)mbox, (caddr_t)raw_mbox, 16);
+       mbox->cmdid             = 0xFE;
+       mbox->busy              = 1;
+       mbox->poll              = 0;
+       mbox->ack               = 0;
+       mbox->numstatus         = 0;
+       mbox->status            = 0;
+
+       wmb();
+       WRINDOOR(raid_dev, raid_dev->mbox_dma | 0x1);
+
+       /* Wait for maximum 1 min for status to post.
+        * If the Firmware SUPPORTS the ABOVE COMMAND,
+        * mbox->cmd will be set to 0
+        * else
+        * the firmware will reject the command with
+        * mbox->numstatus set to 1
+        */
+
+       i = 0;
+       status = 0;
+       while (!mbox->numstatus && mbox->cmd == 0xFF) {
+               rmb();
+               msleep(1);
+               i++;
+               if (i > 1000 * 60) {
+                       status = 1;
+                       break;
+               }
+       }
+       if (mbox->numstatus == 1)
+               status = 1; /*cmd not supported*/
+
+       /* Check for interrupt line */
+       dword = RDOUTDOOR(raid_dev);
+       WROUTDOOR(raid_dev, dword);
+       WRINDOOR(raid_dev,2);
+
+       return status;
+
+blocked_mailbox:
+       con_log(CL_ANN, (KERN_WARNING "megaraid: blocked mailbox\n"));
+       return status;
+}
+
+/**
  * megaraid_mbox_display_scb - display SCB information, mostly debug purposes
- * @param adapter      : controllers' soft state
- * @param scb          : SCB to be displayed
- * @param level        : debug level for console print
+ * @adapter            : controller's soft state
+ * @scb                        : SCB to be displayed
+ * @level              : debug level for console print
  *
  * Diplay information about the given SCB iff the current debug level is
- * verbose
+ * verbose.
  */
 static void
 megaraid_mbox_display_scb(adapter_t *adapter, scb_t *scb)
@@ -3478,7 +3449,7 @@ megaraid_mbox_display_scb(adapter_t *adapter, scb_t *scb)
  * scsi addresses and megaraid scsi and logical drive addresses. We export
  * scsi devices on their actual addresses, whereas the logical drives are
  * exported on a virtual scsi channel.
- **/
+ */
 static void
 megaraid_mbox_setup_device_map(adapter_t *adapter)
 {
@@ -3510,13 +3481,13 @@ megaraid_mbox_setup_device_map(adapter_t *adapter)
 /*
  * START: Interface for the common management module
  *
- * This is the module, which interfaces with the common mangement module to
+ * This is the module, which interfaces with the common management module to
  * provide support for ioctl and sysfs
  */
 
 /**
- * megaraid_cmm_register - register with the mangement module
- * @param adapter      : HBA soft state
+ * megaraid_cmm_register - register with the management module
+ * @adapter            : HBA soft state
  *
  * Register with the management module, which allows applications to issue
  * ioctl calls to the drivers. This interface is used by the management module
@@ -3533,16 +3504,14 @@ megaraid_cmm_register(adapter_t *adapter)
        int             i;
 
        // Allocate memory for the base list of scb for management module.
-       adapter->uscb_list = kmalloc(sizeof(scb_t) * MBOX_MAX_USER_CMDS,
-                       GFP_KERNEL);
+       adapter->uscb_list = kcalloc(MBOX_MAX_USER_CMDS, sizeof(scb_t), GFP_KERNEL);
 
        if (adapter->uscb_list == NULL) {
                con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       "megaraid: out of memory, %s %d\n", __func__,
                        __LINE__));
                return -1;
        }
-       memset(adapter->uscb_list, 0, sizeof(scb_t) * MBOX_MAX_USER_CMDS);
 
 
        // Initialize the synchronization parameters for resources for
@@ -3589,7 +3558,7 @@ megaraid_cmm_register(adapter_t *adapter)
        adp.drvr_data           = (unsigned long)adapter;
        adp.pdev                = adapter->pdev;
        adp.issue_uioc          = megaraid_mbox_mm_handler;
-       adp.timeout             = 300;
+       adp.timeout             = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
        adp.max_kioc            = MBOX_MAX_USER_CMDS;
 
        if ((rval = mraid_mm_register_adp(&adp)) != 0) {
@@ -3605,12 +3574,12 @@ megaraid_cmm_register(adapter_t *adapter)
 
 
 /**
- * megaraid_cmm_unregister - un-register with the mangement module
- * @param adapter      : HBA soft state
+ * megaraid_cmm_unregister - un-register with the management module
+ * @adapter            : HBA soft state
  *
  * Un-register with the management module.
  * FIXME: mgmt module must return failure for unregister if it has pending
- * commands in LLD
+ * commands in LLD.
  */
 static int
 megaraid_cmm_unregister(adapter_t *adapter)
@@ -3623,11 +3592,11 @@ megaraid_cmm_unregister(adapter_t *adapter)
 
 /**
  * megaraid_mbox_mm_handler - interface for CMM to issue commands to LLD
- * @param drvr_data    : LLD specific data
- * @param kioc         : CMM interface packet
- * @param action       : command action
+ * @drvr_data          : LLD specific data
+ * @kioc               : CMM interface packet
+ * @action             : command action
  *
- * This routine is invoked whenever the Common Mangement Module (CMM) has a
+ * This routine is invoked whenever the Common Management Module (CMM) has a
  * command for us. The 'action' parameter specifies if this is a new command
  * or otherwise.
  */
@@ -3678,8 +3647,8 @@ megaraid_mbox_mm_handler(unsigned long drvr_data, uioc_t *kioc, uint32_t action)
 
 /**
  * megaraid_mbox_mm_command - issues commands routed through CMM
- * @param adapter      : HBA soft state
- * @param kioc         : management command packet
+ * @adapter            : HBA soft state
+ * @kioc               : management command packet
  *
  * Issues commands, which are routed through the management module.
  */
@@ -3779,9 +3748,9 @@ wait_till_fw_empty(adapter_t *adapter)
        /*
         * Set the quiescent flag to stop issuing cmds to FW.
         */
-       spin_lock_irqsave(adapter->host_lock, flags);
+       spin_lock_irqsave(&adapter->lock, flags);
        adapter->quiescent++;
-       spin_unlock_irqrestore(adapter->host_lock, flags);
+       spin_unlock_irqrestore(&adapter->lock, flags);
 
        /*
         * Wait till there are no more cmds outstanding at FW. Try for at most
@@ -3816,7 +3785,6 @@ megaraid_mbox_mm_done(adapter_t *adapter, scb_t *scb)
        unsigned long           flags;
 
        kioc                    = (uioc_t *)scb->gp;
-       kioc->status            = 0;
        mbox64                  = (mbox64_t *)(unsigned long)kioc->cmdbuf;
        mbox64->mbox32.status   = scb->status;
        raw_mbox                = (uint8_t *)&mbox64->mbox32;
@@ -3849,8 +3817,8 @@ megaraid_mbox_mm_done(adapter_t *adapter, scb_t *scb)
 
 /**
  * gather_hbainfo - HBA characteristics for the applications
- * @param adapter      : HBA soft state
- * @param hinfo                : pointer to the caller's host info strucuture
+ * @adapter            : HBA soft state
+ * @hinfo              : pointer to the caller's host info strucuture
  */
 static int
 gather_hbainfo(adapter_t *adapter, mraid_hba_info_t *hinfo)
@@ -3884,16 +3852,15 @@ gather_hbainfo(adapter_t *adapter, mraid_hba_info_t *hinfo)
 
 /**
  * megaraid_sysfs_alloc_resources - allocate sysfs related resources
+ * @adapter    : controller's soft state
  *
  * Allocate packets required to issue FW calls whenever the sysfs attributes
  * are read. These attributes would require up-to-date information from the
  * FW. Also set up resources for mutual exclusion to share these resources and
  * the wait queue.
  *
- * @param adapter : controller's soft state
- *
- * @return 0 on success
- * @return -ERROR_CODE on failure
+ * Return 0 on success.
+ * Return -ERROR_CODE on failure.
  */
 static int
 megaraid_sysfs_alloc_resources(adapter_t *adapter)
@@ -3912,7 +3879,7 @@ megaraid_sysfs_alloc_resources(adapter_t *adapter)
                !raid_dev->sysfs_buffer) {
 
                con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       "megaraid: out of memory, %s %d\n", __func__,
                        __LINE__));
 
                rval = -ENOMEM;
@@ -3920,7 +3887,7 @@ megaraid_sysfs_alloc_resources(adapter_t *adapter)
                megaraid_sysfs_free_resources(adapter);
        }
 
-       sema_init(&raid_dev->sysfs_sem, 1);
+       mutex_init(&raid_dev->sysfs_mtx);
 
        init_waitqueue_head(&raid_dev->sysfs_wait_q);
 
@@ -3930,19 +3897,17 @@ megaraid_sysfs_alloc_resources(adapter_t *adapter)
 
 /**
  * megaraid_sysfs_free_resources - free sysfs related resources
+ * @adapter    : controller's soft state
  *
  * Free packets allocated for sysfs FW commands
- *
- * @param adapter : controller's soft state
  */
 static void
 megaraid_sysfs_free_resources(adapter_t *adapter)
 {
        mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
 
-       if (raid_dev->sysfs_uioc) kfree(raid_dev->sysfs_uioc);
-
-       if (raid_dev->sysfs_mbox64) kfree(raid_dev->sysfs_mbox64);
+       kfree(raid_dev->sysfs_uioc);
+       kfree(raid_dev->sysfs_mbox64);
 
        if (raid_dev->sysfs_buffer) {
                pci_free_consistent(adapter->pdev, PAGE_SIZE,
@@ -3953,10 +3918,9 @@ megaraid_sysfs_free_resources(adapter_t *adapter)
 
 /**
  * megaraid_sysfs_get_ldmap_done - callback for get ldmap
+ * @uioc       : completed packet
  *
  * Callback routine called in the ISR/tasklet context for get ldmap call
- *
- * @param uioc : completed packet
  */
 static void
 megaraid_sysfs_get_ldmap_done(uioc_t *uioc)
@@ -3972,12 +3936,11 @@ megaraid_sysfs_get_ldmap_done(uioc_t *uioc)
 
 /**
  * megaraid_sysfs_get_ldmap_timeout - timeout handling for get ldmap
+ * @data       : timed out packet
  *
  * Timeout routine to recover and return to application, in case the adapter
- * has stopped responding. A timeout of 60 seconds for this command seem like
- * a good value
- *
- * @param uioc : timed out packet
+ * has stopped responding. A timeout of 60 seconds for this command seems like
+ * a good value.
  */
 static void
 megaraid_sysfs_get_ldmap_timeout(unsigned long data)
@@ -3994,10 +3957,11 @@ megaraid_sysfs_get_ldmap_timeout(unsigned long data)
 
 /**
  * megaraid_sysfs_get_ldmap - get update logical drive map
+ * @adapter    : controller's soft state
  *
  * This routine will be called whenever user reads the logical drive
  * attributes, go get the current logical drive mapping table from the
- * firmware. We use the managment API's to issue commands to the controller.
+ * firmware. We use the management API's to issue commands to the controller.
  *
  * NOTE: The commands issuance functionality is not generalized and
  * implemented in context of "get ld map" command only. If required, the
@@ -4005,10 +3969,8 @@ megaraid_sysfs_get_ldmap_timeout(unsigned long data)
  * standalone libary. For now, this should suffice since there is no other
  * user of this interface.
  *
- * @param adapter : controller's soft state
- *
- * @return 0 on success
- * @return -1 on failure
+ * Return 0 on success.
+ * Return -1 on failure.
  */
 static int
 megaraid_sysfs_get_ldmap(adapter_t *adapter)
@@ -4026,7 +3988,7 @@ megaraid_sysfs_get_ldmap(adapter_t *adapter)
        /*
         * Allow only one read at a time to go through the sysfs attributes
         */
-       down(&raid_dev->sysfs_sem);
+       mutex_lock(&raid_dev->sysfs_mtx);
 
        uioc    = raid_dev->sysfs_uioc;
        mbox64  = raid_dev->sysfs_mbox64;
@@ -4102,7 +4064,7 @@ megaraid_sysfs_get_ldmap(adapter_t *adapter)
 
        del_timer_sync(timerp);
 
-       up(&raid_dev->sysfs_sem);
+       mutex_unlock(&raid_dev->sysfs_mtx);
 
        return rval;
 }
@@ -4110,18 +4072,18 @@ megaraid_sysfs_get_ldmap(adapter_t *adapter)
 
 /**
  * megaraid_sysfs_show_app_hndl - display application handle for this adapter
+ * @cdev       : class device object representation for the host
+ * @buf                : buffer to send data to
  *
  * Display the handle used by the applications while executing management
  * tasks on the adapter. We invoke a management module API to get the adapter
  * handle, since we do not interface with applications directly.
- *
- * @param cdev : class device object representation for the host
- * @param buf  : buffer to send data to
  */
 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;
 
@@ -4133,16 +4095,18 @@ megaraid_sysfs_show_app_hndl(struct class_device *cdev, char *buf)
 
 /**
  * megaraid_sysfs_show_ldnum - display the logical drive number for this device
+ * @dev                : device object representation for the scsi device
+ * @attr       : device attribute to show
+ * @buf                : buffer to send data to
  *
  * Display the logical drive number for the device in question, if it a valid
- * logical drive. For physical devices, "-1" is returned
- * The logical drive number is displayed in following format
+ * logical drive. For physical devices, "-1" is returned.
+ *
+ * The logical drive number is displayed in following format:
  *
  * <SCSI ID> <LD NUM> <LD STICKY ID> <APP ADAPTER HANDLE>
- *   <int>     <int>       <int>            <int>
  *
- * @param dev  : device object representation for the scsi device
- * @param buf  : buffer to send data to
+ *   <int>     <int>       <int>            <int>
  */
 static ssize_t
 megaraid_sysfs_show_ldnum(struct device *dev, struct device_attribute *attr, char *buf)