fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / scsi / megaraid / megaraid_mbox.c
index 7afd6a5..7bac86d 100644 (file)
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_mbox.c
- * Version     : v2.20.4 (September 27 2004)
+ * Version     : v2.20.4.9 (Jul 16 2006)
  *
  * Authors:
  *     Atul Mukker             <Atul.Mukker@lsil.com>
  *     Sreenivas Bagalkote     <Sreenivas.Bagalkote@lsil.com>
  *     Manoj Jose              <Manoj.Jose@lsil.com>
+ *     Seokmann Ju             <Seokmann.Ju@lsil.com>
  *
  * List of supported controllers
  *
  * INTEL RAID Controller SROMBU42E     1000    0408    8086    3499
  * INTEL RAID Controller SRCU51L       1000    1960    8086    0520
  *
- *
  * FSC MegaRAID PCI Express ROMB       1000    0408    1734    1065
  *
- *
  * ACER        MegaRAID ROMB-2E                1000    0408    1025    004D
  *
+ * NEC MegaRAID PCI Express ROMB       1000    0408    1033    8287
  *
  * For history of changes, see Documentation/ChangeLog.megaraid
  */
@@ -77,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 *);
@@ -91,6 +91,9 @@ static void megaraid_free_cmd_packets(adapter_t *);
 static int megaraid_mbox_setup_dma_pools(adapter_t *);
 static void megaraid_mbox_teardown_dma_pools(adapter_t *);
 
+static int megaraid_sysfs_alloc_resources(adapter_t *);
+static void megaraid_sysfs_free_resources(adapter_t *);
+
 static int megaraid_abort_handler(struct scsi_cmnd *);
 static int megaraid_reset_handler(struct scsi_cmnd *);
 
@@ -117,10 +120,13 @@ 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_ldnum(struct device *, struct device_attribute *attr, char *);
+
 static int megaraid_cmm_register(adapter_t *);
 static int megaraid_cmm_unregister(adapter_t *);
 static int megaraid_mbox_mm_handler(unsigned long, uioc_t *, uint32_t);
@@ -131,7 +137,7 @@ static int wait_till_fw_empty(adapter_t *);
 
 
 
-MODULE_AUTHOR("LSI Logic Corporation");
+MODULE_AUTHOR("sju@lsil.com");
 MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGARAID_VERSION);
@@ -197,7 +203,7 @@ MODULE_PARM_DESC(debug_level, "Debug level for driver (default=0)");
  * ### global data ###
  */
 static uint8_t megaraid_mbox_version[8] =
-       { 0x02, 0x20, 0x04, 0x00, 9, 27, 20, 4 };
+       { 0x02, 0x20, 0x04, 0x06, 3, 7, 20, 5 };
 
 
 /*
@@ -224,9 +230,9 @@ static struct pci_device_id pci_id_table_g[] =  {
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_PERC4_QC,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC4_QC,
+               PCI_DEVICE_ID_VERDE,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_DELL,
@@ -266,171 +272,27 @@ static struct pci_device_id pci_id_table_g[] =  {
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_PERC4E_DC_320_2E,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC4E_DC_320_2E,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_PERC4E_SC_320_1E,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC4E_SC_320_1E,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_QC,
+               PCI_DEVICE_ID_DOBSON,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                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_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_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_0x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_0x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_2x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_2x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_4x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_4x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_1E,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_1E,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_2E,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_2E,
-       },
-       {
-               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_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_150_6,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_150_6,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_300_4x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_300_4x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_300_8x,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_300_8x,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCU42X,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCU42X,
-       },
-       {
-               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_SRCU42E,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCU42E,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCZCRX,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCZCRX,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCS28X,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCS28X,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_ALIEF,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_ALIEF,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_HARWICH,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_HARWICH,
-       },
-       {
-               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,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB,
-               PCI_SUBSYS_ID_FSC,
-               PCI_SUBSYS_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB,
+               PCI_DEVICE_ID_AMI_MEGARAID3,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_ACER_ROMB_2E,
-               PCI_VENDOR_ID_AI,
-               PCI_SUBSYS_ID_MEGARAID_ACER_ROMB_2E,
+               PCI_DEVICE_ID_LINDSAY,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {0}     /* Terminating entry */
 };
@@ -442,12 +304,48 @@ static struct pci_driver megaraid_pci_driver_g = {
        .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,
 };
 
 
+
+// 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,
+               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,
+       NULL,
+};
+
+
+DEVICE_ATTR(megaraid_mbox_ld, S_IRUSR, megaraid_sysfs_show_ldnum, NULL);
+
+// Host template initializer for megaraid mbox sysfs device attributes
+static struct device_attribute *megaraid_sdev_attrs[] = {
+       &dev_attr_megaraid_mbox_ld,
+       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
  */
@@ -460,7 +358,10 @@ 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,
 };
 
 
@@ -491,7 +392,8 @@ megaraid_init(void)
 
 
        // register as a PCI hot-plug driver module
-       if ((rval = pci_module_init(&megaraid_pci_driver_g))) {
+       rval = pci_register_driver(&megaraid_pci_driver_g);
+       if (rval < 0) {
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: could not register hotplug support.\n"));
        }
@@ -571,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, 0xFFFFFFFF) != 0) {
+       if (pci_set_dma_mask(adapter->pdev, DMA_32BIT_MASK) != 0) {
 
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: pci_set_dma_mask failed:%d\n", __LINE__));
@@ -582,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.
@@ -720,9 +620,9 @@ megaraid_detach_one(struct pci_dev *pdev)
  * 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) {
@@ -764,10 +664,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;
@@ -834,12 +730,13 @@ megaraid_io_detach(adapter_t *adapter)
  * . 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;
@@ -872,8 +769,7 @@ megaraid_init_mbox(adapter_t *adapter)
                goto out_free_raid_dev;
        }
 
-       raid_dev->baseaddr = (unsigned long)
-                       ioremap_nocache(raid_dev->baseport, 128);
+       raid_dev->baseaddr = ioremap_nocache(raid_dev->baseport, 128);
 
        if (!raid_dev->baseaddr) {
 
@@ -888,7 +784,7 @@ megaraid_init_mbox(adapter_t *adapter)
        //
 
        // request IRQ and register the interrupt service routine
-       if (request_irq(adapter->irq, megaraid_isr, SA_SHIRQ, "megaraid",
+       if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid",
                adapter)) {
 
                con_log(CL_ANN, (KERN_WARNING
@@ -948,6 +844,8 @@ megaraid_init_mbox(adapter_t *adapter)
                }
                adapter->device_ids[adapter->max_channel][adapter->init_id] =
                        0xFF;
+
+               raid_dev->random_del_supported = 1;
        }
 
        /*
@@ -972,14 +870,43 @@ megaraid_init_mbox(adapter_t *adapter)
         */
        adapter->cmd_per_lun = megaraid_cmd_per_lun;
 
+       /*
+        * Allocate resources required to issue FW calls, when sysfs is
+        * accessed
+        */
+       if (megaraid_sysfs_alloc_resources(adapter) != 0) {
+               goto out_alloc_cmds;
+       }
+
        // Set the DMA mask to 64-bit. All supported controllers as capable of
        // DMA in this range
-       if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFFFFFFFFFFULL) != 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_64BIT_MASK)) {
+                       con_log(CL_ANN, (KERN_WARNING
+                               "megaraid: DMA mask for 64-bit failed\n"));
 
-               goto out_alloc_cmds;
+                       if (pci_set_dma_mask (adapter->pdev, DMA_32BIT_MASK)) {
+                               con_log(CL_ANN, (KERN_WARNING
+                                       "megaraid: 32-bit DMA mask failed\n"));
+                               goto out_free_sysfs_res;
+                       }
+               }
        }
 
        // setup tasklet for DPC
@@ -991,12 +918,14 @@ megaraid_init_mbox(adapter_t *adapter)
 
        return 0;
 
+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_iounmap:
-       iounmap((caddr_t)raid_dev->baseaddr);
+       iounmap(raid_dev->baseaddr);
 out_release_regions:
        pci_release_regions(pdev);
 out_free_raid_dev:
@@ -1020,11 +949,13 @@ megaraid_fini_mbox(adapter_t *adapter)
 
        tasklet_kill(&adapter->dpc_h);
 
+       megaraid_sysfs_free_resources(adapter);
+
        megaraid_free_cmd_packets(adapter);
 
        free_irq(adapter->irq, adapter);
 
-       iounmap((caddr_t)raid_dev->baseaddr);
+       iounmap(raid_dev->baseaddr);
 
        pci_release_regions(adapter->pdev);
 
@@ -1373,7 +1304,7 @@ megaraid_mbox_teardown_dma_pools(adapter_t *adapter)
  * return the scb from the head of the free list. NULL if there are none
  * available
  **/
-static inline scb_t *
+static scb_t *
 megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp)
 {
        struct list_head        *head = &adapter->kscb_pool;
@@ -1436,7 +1367,7 @@ megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb)
  *
  * prepare the scatter-gather list
  */
-static inline int
+static int
 megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
 {
        struct scatterlist      *sgl;
@@ -1509,7 +1440,7 @@ megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
  *
  * post the command to the controller if mailbox is availble.
  */
-static inline int
+static int
 mbox_post_cmd(adapter_t *adapter, scb_t *scb)
 {
        mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
@@ -1554,12 +1485,14 @@ mbox_post_cmd(adapter_t *adapter, scb_t *scb)
 
        if (scb->dma_direction == PCI_DMA_TODEVICE) {
                if (!scb->scp->use_sg) {        // sg list not used
-                       pci_dma_sync_single(adapter->pdev, ccb->buf_dma_h,
+                       pci_dma_sync_single_for_device(adapter->pdev,
+                                       ccb->buf_dma_h,
                                        scb->scp->request_bufflen,
                                        PCI_DMA_TODEVICE);
                }
                else {
-                       pci_dma_sync_sg(adapter->pdev, scb->scp->request_buffer,
+                       pci_dma_sync_sg_for_device(adapter->pdev,
+                               scb->scp->request_buffer,
                                scb->scp->use_sg, PCI_DMA_TODEVICE);
                }
        }
@@ -1595,10 +1528,6 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
        scp->scsi_done  = done;
        scp->result     = 0;
 
-       ASSERT(spin_is_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
@@ -1608,22 +1537,16 @@ 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
@@ -1737,6 +1660,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:
@@ -2037,7 +1968,7 @@ megaraid_mbox_runpendq(adapter_t *adapter, scb_t *scb_q)
 
        while (!list_empty(&adapter->pend_list)) {
 
-               ASSERT(spin_is_locked(PENDING_LIST_LOCK(adapter)));
+               assert_spin_locked(PENDING_LIST_LOCK(adapter));
 
                scb = list_entry(adapter->pend_list.next, scb_t, list);
 
@@ -2101,7 +2032,8 @@ megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb,
        channel = scb->dev_channel;
        target  = scb->dev_target;
 
-       pthru->timeout          = 1;    // 0=6sec, 1=60sec, 2=10min, 3=3hrs
+       // 0=6sec, 1=60sec, 2=10min, 3=3hrs, 4=NO timeout
+       pthru->timeout          = 4;    
        pthru->ars              = 1;
        pthru->islogical        = 0;
        pthru->channel          = 0;
@@ -2149,7 +2081,8 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
        channel = scb->dev_channel;
        target  = scb->dev_target;
 
-       epthru->timeout         = 1;    // 0=6sec, 1=60sec, 2=10min, 3=3hrs
+       // 0=6sec, 1=60sec, 2=10min, 3=3hrs, 4=NO timeout
+       epthru->timeout         = 4;    
        epthru->ars             = 1;
        epthru->islogical       = 0;
        epthru->channel         = 0;
@@ -2183,7 +2116,7 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
  *
  * 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);
@@ -2298,7 +2231,7 @@ megaraid_ack_sequence(adapter_t *adapter)
  * 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;
@@ -2321,7 +2254,7 @@ 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;
@@ -2332,7 +2265,7 @@ megaraid_mbox_sync_scb(adapter_t *adapter, scb_t *scb)
 
        case MRAID_DMA_WBUF:
                if (scb->dma_direction == PCI_DMA_FROMDEVICE) {
-                       pci_dma_sync_single(adapter->pdev,
+                       pci_dma_sync_single_for_cpu(adapter->pdev,
                                        ccb->buf_dma_h,
                                        scb->scp->request_bufflen,
                                        PCI_DMA_FROMDEVICE);
@@ -2345,7 +2278,7 @@ megaraid_mbox_sync_scb(adapter_t *adapter, scb_t *scb)
 
        case MRAID_DMA_WSG:
                if (scb->dma_direction == PCI_DMA_FROMDEVICE) {
-                       pci_dma_sync_sg(adapter->pdev,
+                       pci_dma_sync_sg_for_cpu(adapter->pdev,
                                        scb->scp->request_buffer,
                                        scb->scp->use_sg, PCI_DMA_FROMDEVICE);
                }
@@ -2391,6 +2324,7 @@ megaraid_mbox_dpc(unsigned long devp)
        unsigned long           flags;
        uint8_t                 c;
        int                     status;
+       uioc_t                  *kioc;
 
 
        if (!adapter) return;
@@ -2433,6 +2367,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;
@@ -2578,9 +2515,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;
@@ -2609,8 +2544,6 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
        adapter         = SCP2ADAPTER(scp);
        raid_dev        = ADAP2RAIDDEV(adapter);
 
-       ASSERT(spin_is_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),
@@ -2690,6 +2623,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;
 
@@ -2712,6 +2646,7 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
                        }
                }
        }
+       spin_unlock_irq(&adapter->lock);
 
        if (!found) {
                con_log(CL_ANN, (KERN_WARNING
@@ -2728,7 +2663,6 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
        return FAILED;
 }
 
-
 /**
  * megaraid_reset_handler - device reset hadler for mailbox based driver
  * @scp                : reference command
@@ -2752,14 +2686,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_is_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
@@ -2775,34 +2706,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);
 
@@ -2811,19 +2759,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) {
@@ -2832,7 +2779,8 @@ 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
@@ -2841,7 +2789,10 @@ megaraid_reset_handler(struct scsi_cmnd *scp)
 
 
        // 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;
@@ -2858,10 +2809,11 @@ megaraid_reset_handler(struct scsi_cmnd *scp)
                                "megaraid: reservation reset failed\n"));
        }
 
+ out:
+       spin_unlock_irq(&adapter->lock);
        return rval;
 }
 
-
 /*
  * START: internal commands library
  *
@@ -2914,7 +2866,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();
@@ -3035,11 +2987,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"));
@@ -3300,7 +3254,7 @@ megaraid_mbox_support_random_del(adapter_t *adapter)
        memset((caddr_t)raw_mbox, 0, sizeof(mbox_t));
 
        raw_mbox[0] = FC_DEL_LOGDRV;
-       raw_mbox[0] = OP_SUP_DEL_LOGDRV;
+       raw_mbox[2] = OP_SUP_DEL_LOGDRV;
 
        // Issue the command
        rval = 0;
@@ -3591,7 +3545,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             = 30;
+       adp.timeout             = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
        adp.max_kioc            = MBOX_MAX_USER_CMDS;
 
        if ((rval = mraid_mm_register_adp(&adp)) != 0) {
@@ -3713,8 +3667,9 @@ megaraid_mbox_mm_command(adapter_t *adapter, uioc_t *kioc)
 
        spin_unlock_irqrestore(USER_FREE_LIST_LOCK(adapter), flags);
 
-       scb->state      = SCB_ACTIVE;
-       scb->dma_type   = MRAID_DMA_NONE;
+       scb->state              = SCB_ACTIVE;
+       scb->dma_type           = MRAID_DMA_NONE;
+       scb->dma_direction      = PCI_DMA_NONE;
 
        ccb             = (mbox_ccb_t *)scb->ccb;
        mbox64          = (mbox64_t *)(unsigned long)kioc->cmdbuf;
@@ -3780,9 +3735,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
@@ -3817,7 +3772,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;
@@ -3882,6 +3836,323 @@ gather_hbainfo(adapter_t *adapter, mraid_hba_info_t *hinfo)
  */
 
 
+
+/**
+ * megaraid_sysfs_alloc_resources - allocate sysfs related resources
+ *
+ * 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
+ */
+static int
+megaraid_sysfs_alloc_resources(adapter_t *adapter)
+{
+       mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
+       int             rval = 0;
+
+       raid_dev->sysfs_uioc = kmalloc(sizeof(uioc_t), GFP_KERNEL);
+
+       raid_dev->sysfs_mbox64 = kmalloc(sizeof(mbox64_t), GFP_KERNEL);
+
+       raid_dev->sysfs_buffer = pci_alloc_consistent(adapter->pdev,
+                       PAGE_SIZE, &raid_dev->sysfs_buffer_dma);
+
+       if (!raid_dev->sysfs_uioc || !raid_dev->sysfs_mbox64 ||
+               !raid_dev->sysfs_buffer) {
+
+               con_log(CL_ANN, (KERN_WARNING
+                       "megaraid: out of memory, %s %d\n", __FUNCTION__,
+                       __LINE__));
+
+               rval = -ENOMEM;
+
+               megaraid_sysfs_free_resources(adapter);
+       }
+
+       sema_init(&raid_dev->sysfs_sem, 1);
+
+       init_waitqueue_head(&raid_dev->sysfs_wait_q);
+
+       return rval;
+}
+
+
+/**
+ * megaraid_sysfs_free_resources - free sysfs related resources
+ *
+ * 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);
+
+       kfree(raid_dev->sysfs_uioc);
+       kfree(raid_dev->sysfs_mbox64);
+
+       if (raid_dev->sysfs_buffer) {
+               pci_free_consistent(adapter->pdev, PAGE_SIZE,
+                       raid_dev->sysfs_buffer, raid_dev->sysfs_buffer_dma);
+       }
+}
+
+
+/**
+ * megaraid_sysfs_get_ldmap_done - callback for get ldmap
+ *
+ * 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)
+{
+       adapter_t       *adapter = (adapter_t *)uioc->buf_vaddr;
+       mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
+
+       uioc->status = 0;
+
+       wake_up(&raid_dev->sysfs_wait_q);
+}
+
+
+/**
+ * megaraid_sysfs_get_ldmap_timeout - timeout handling for get ldmap
+ *
+ * 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
+ */
+static void
+megaraid_sysfs_get_ldmap_timeout(unsigned long data)
+{
+       uioc_t          *uioc = (uioc_t *)data;
+       adapter_t       *adapter = (adapter_t *)uioc->buf_vaddr;
+       mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
+
+       uioc->status = -ETIME;
+
+       wake_up(&raid_dev->sysfs_wait_q);
+}
+
+
+/**
+ * megaraid_sysfs_get_ldmap - get update logical drive map
+ *
+ * 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.
+ *
+ * NOTE: The commands issuance functionality is not generalized and
+ * implemented in context of "get ld map" command only. If required, the
+ * command issuance logical can be trivially pulled out and implemented as a
+ * 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
+ */
+static int
+megaraid_sysfs_get_ldmap(adapter_t *adapter)
+{
+       mraid_device_t          *raid_dev = ADAP2RAIDDEV(adapter);
+       uioc_t                  *uioc;
+       mbox64_t                *mbox64;
+       mbox_t                  *mbox;
+       char                    *raw_mbox;
+       struct timer_list       sysfs_timer;
+       struct timer_list       *timerp;
+       caddr_t                 ldmap;
+       int                     rval = 0;
+
+       /*
+        * Allow only one read at a time to go through the sysfs attributes
+        */
+       down(&raid_dev->sysfs_sem);
+
+       uioc    = raid_dev->sysfs_uioc;
+       mbox64  = raid_dev->sysfs_mbox64;
+       ldmap   = raid_dev->sysfs_buffer;
+
+       memset(uioc, 0, sizeof(uioc_t));
+       memset(mbox64, 0, sizeof(mbox64_t));
+       memset(ldmap, 0, sizeof(raid_dev->curr_ldmap));
+
+       mbox            = &mbox64->mbox32;
+       raw_mbox        = (char *)mbox;
+       uioc->cmdbuf    = (uint64_t)(unsigned long)mbox64;
+       uioc->buf_vaddr = (caddr_t)adapter;
+       uioc->status    = -ENODATA;
+       uioc->done      = megaraid_sysfs_get_ldmap_done;
+
+       /*
+        * Prepare the mailbox packet to get the current logical drive mapping
+        * table
+        */
+       mbox->xferaddr = (uint32_t)raid_dev->sysfs_buffer_dma;
+
+       raw_mbox[0] = FC_DEL_LOGDRV;
+       raw_mbox[2] = OP_GET_LDID_MAP;
+
+       /*
+        * Setup a timer to recover from a non-responding controller
+        */
+       timerp  = &sysfs_timer;
+       init_timer(timerp);
+
+       timerp->function        = megaraid_sysfs_get_ldmap_timeout;
+       timerp->data            = (unsigned long)uioc;
+       timerp->expires         = jiffies + 60 * HZ;
+
+       add_timer(timerp);
+
+       /*
+        * Send the command to the firmware
+        */
+       rval = megaraid_mbox_mm_command(adapter, uioc);
+
+       if (rval == 0) {        // command successfully issued
+               wait_event(raid_dev->sysfs_wait_q, (uioc->status != -ENODATA));
+
+               /*
+                * Check if the command timed out
+                */
+               if (uioc->status == -ETIME) {
+                       con_log(CL_ANN, (KERN_NOTICE
+                               "megaraid: sysfs get ld map timed out\n"));
+
+                       rval = -ETIME;
+               }
+               else {
+                       rval = mbox->status;
+               }
+
+               if (rval == 0) {
+                       memcpy(raid_dev->curr_ldmap, ldmap,
+                               sizeof(raid_dev->curr_ldmap));
+               }
+               else {
+                       con_log(CL_ANN, (KERN_NOTICE
+                               "megaraid: get ld map failed with %x\n", rval));
+               }
+       }
+       else {
+               con_log(CL_ANN, (KERN_NOTICE
+                       "megaraid: could not issue ldmap command:%x\n", rval));
+       }
+
+
+       del_timer_sync(timerp);
+
+       up(&raid_dev->sysfs_sem);
+
+       return rval;
+}
+
+
+/**
+ * megaraid_sysfs_show_app_hndl - display application handle for this adapter
+ *
+ * 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)
+{
+       struct Scsi_Host *shost = class_to_shost(cdev);
+       adapter_t       *adapter = (adapter_t *)SCSIHOST2ADAP(shost);
+       uint32_t        app_hndl;
+
+       app_hndl = mraid_mm_adapter_app_handle(adapter->unique_id);
+
+       return snprintf(buf, 8, "%u\n", app_hndl);
+}
+
+
+/**
+ * megaraid_sysfs_show_ldnum - display the logical drive number for this device
+ *
+ * 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
+ *
+ * <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
+ */
+static ssize_t
+megaraid_sysfs_show_ldnum(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct scsi_device *sdev = to_scsi_device(dev);
+       adapter_t       *adapter = (adapter_t *)SCSIHOST2ADAP(sdev->host);
+       mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
+       int             scsi_id = -1;
+       int             logical_drv = -1;
+       int             ldid_map = -1;
+       uint32_t        app_hndl = 0;
+       int             mapped_sdev_id;
+       int             rval;
+       int             i;
+
+       if (raid_dev->random_del_supported &&
+                       MRAID_IS_LOGICAL_SDEV(adapter, sdev)) {
+
+               rval = megaraid_sysfs_get_ldmap(adapter);
+               if (rval == 0) {
+
+                       for (i = 0; i < MAX_LOGICAL_DRIVES_40LD; i++) {
+
+                               mapped_sdev_id = sdev->id;
+
+                               if (sdev->id > adapter->init_id) {
+                                       mapped_sdev_id -= 1;
+                               }
+
+                               if (raid_dev->curr_ldmap[i] == mapped_sdev_id) {
+
+                                       scsi_id = sdev->id;
+
+                                       logical_drv = i;
+
+                                       ldid_map = raid_dev->curr_ldmap[i];
+
+                                       app_hndl = mraid_mm_adapter_app_handle(
+                                                       adapter->unique_id);
+
+                                       break;
+                               }
+                       }
+               }
+               else {
+                       con_log(CL_ANN, (KERN_NOTICE
+                               "megaraid: sysfs get ld map failed: %x\n",
+                               rval));
+               }
+       }
+
+       return snprintf(buf, 36, "%d %d %d %d\n", scsi_id, logical_drv,
+                       ldid_map, app_hndl);
+}
+
+
 /*
  * END: Mailbox Low Level Driver
  */