mlx4_en: Fix a kernel panic when waking tx queue
[safe/jmp/linux-2.6] / drivers / scsi / megaraid.c
index f979252..49eb061 100644 (file)
@@ -2,7 +2,7 @@
  *
  *                     Linux MegaRAID device driver
  *
- * Copyright © 2002  LSI Logic Corporation.
+ * Copyright (c) 2002  LSI Logic Corporation.
  *
  *        This program is free software; you can redistribute it and/or
  *        modify it under the terms of the GNU General Public License
@@ -17,7 +17,8 @@
  * Copyright (c) 2003  Christoph Hellwig  <hch@lst.de>
  *       - new-style, hotplug-aware pci probing and scsi registration
  *
- * Version : v2.00.3 (Feb 19, 2003) - Atul Mukker <Atul.Mukker@lsil.com>
+ * Version : v2.00.4 Mon Nov 14 14:02:43 EST 2005 - Seokmann Ju
+ *                                             <Seokmann.Ju@lsil.com>
  *
  * Description: Linux device driver for LSI Logic MegaRAID controller
  *
@@ -44,6 +45,8 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/init.h>
+#include <linux/dma-mapping.h>
+#include <linux/smp_lock.h>
 #include <scsi/scsicam.h>
 
 #include "scsi.h"
 
 #include "megaraid.h"
 
-#define MEGARAID_MODULE_VERSION "2.00.3"
+#define MEGARAID_MODULE_VERSION "2.00.4"
 
-MODULE_AUTHOR ("LSI Logic Corporation");
-MODULE_DESCRIPTION ("LSI Logic MegaRAID driver");
+MODULE_AUTHOR ("sju@lsil.com");
+MODULE_DESCRIPTION ("LSI Logic MegaRAID legacy driver");
 MODULE_LICENSE ("GPL");
 MODULE_VERSION(MEGARAID_MODULE_VERSION);
 
@@ -71,10 +74,10 @@ static unsigned short int max_mbox_busy_wait = MBOX_BUSY_WAIT;
 module_param(max_mbox_busy_wait, ushort, 0);
 MODULE_PARM_DESC(max_mbox_busy_wait, "Maximum wait for mailbox in microseconds if busy (default=MBOX_BUSY_WAIT=10)");
 
-#define RDINDOOR(adapter)              readl((adapter)->base + 0x20)
-#define RDOUTDOOR(adapter)             readl((adapter)->base + 0x2C)
-#define WRINDOOR(adapter,value)                writel(value, (adapter)->base + 0x20)
-#define WROUTDOOR(adapter,value)       writel(value, (adapter)->base + 0x2C)
+#define RDINDOOR(adapter)      readl((adapter)->mmio_base + 0x20)
+#define RDOUTDOOR(adapter)     readl((adapter)->mmio_base + 0x2C)
+#define WRINDOOR(adapter,value)         writel(value, (adapter)->mmio_base + 0x20)
+#define WROUTDOOR(adapter,value) writel(value, (adapter)->mmio_base + 0x2C)
 
 /*
  * Global variables
@@ -90,7 +93,7 @@ static struct mega_hbas mega_hbas[MAX_CONTROLLERS];
 /*
  * The File Operations structure for the serial/ioctl interface of the driver
  */
-static struct file_operations megadev_fops = {
+static const struct file_operations megadev_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = megadev_ioctl,
        .open           = megadev_open,
@@ -149,19 +152,19 @@ mega_setup_mailbox(adapter_t *adapter)
         */
        if( adapter->flag & BOARD_IOMAP ) {
 
-               outb_p(adapter->mbox_dma & 0xFF,
+               outb(adapter->mbox_dma & 0xFF,
                                adapter->host->io_port + MBOX_PORT0);
 
-               outb_p((adapter->mbox_dma >> 8) & 0xFF,
+               outb((adapter->mbox_dma >> 8) & 0xFF,
                                adapter->host->io_port + MBOX_PORT1);
 
-               outb_p((adapter->mbox_dma >> 16) & 0xFF,
+               outb((adapter->mbox_dma >> 16) & 0xFF,
                                adapter->host->io_port + MBOX_PORT2);
 
-               outb_p((adapter->mbox_dma >> 24) & 0xFF,
+               outb((adapter->mbox_dma >> 24) & 0xFF,
                                adapter->host->io_port + MBOX_PORT3);
 
-               outb_p(ENABLE_MBOX_BYTE,
+               outb(ENABLE_MBOX_BYTE,
                                adapter->host->io_port + ENABLE_MBOX_REGION);
 
                irq_ack(adapter);
@@ -521,10 +524,8 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
        /*
         * filter the internal and ioctl commands
         */
-       if((cmd->cmnd[0] == MEGA_INTERNAL_CMD)) {
-               return cmd->buffer;
-       }
-
+       if((cmd->cmnd[0] == MEGA_INTERNAL_CMD))
+               return (scb_t *)cmd->host_scribble;
 
        /*
         * We know what channels our logical drives are on - mega_find_card()
@@ -655,22 +656,14 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
 
                case MODE_SENSE: {
                        char *buf;
+                       struct scatterlist *sg;
 
-                       if (cmd->use_sg) {
-                               struct scatterlist *sg;
+                       sg = scsi_sglist(cmd);
+                       buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
 
-                               sg = (struct scatterlist *)cmd->request_buffer;
-                               buf = kmap_atomic(sg->page, KM_IRQ0) +
-                                       sg->offset;
-                       } else
-                               buf = cmd->request_buffer;
-                       memset(cmd->request_buffer, 0, cmd->cmnd[4]);
-                       if (cmd->use_sg) {
-                               struct scatterlist *sg;
+                       memset(buf, 0, cmd->cmnd[4]);
+                       kunmap_atomic(buf - sg->offset, KM_IRQ0);
 
-                               sg = (struct scatterlist *)cmd->request_buffer;
-                               kunmap_atomic(buf - sg->offset, KM_IRQ0);
-                       }
                        cmd->result = (DID_OK << 16);
                        cmd->scsi_done(cmd);
                        return NULL;
@@ -1254,14 +1247,13 @@ bug_blocked_mailbox:
  * megaraid_isr_iomapped()
  * @irq - irq
  * @devp - pointer to our soft state
- * @regs - unused
  *
  * Interrupt service routine for io-mapped controllers.
  * Find out if our device is interrupting. If yes, acknowledge the interrupt
  * and service the completed commands.
  */
 static irqreturn_t
-megaraid_isr_iomapped(int irq, void *devp, struct pt_regs *regs)
+megaraid_isr_iomapped(int irq, void *devp)
 {
        adapter_t       *adapter = devp;
        unsigned long   flags;
@@ -1331,14 +1323,13 @@ megaraid_isr_iomapped(int irq, void *devp, struct pt_regs *regs)
  * megaraid_isr_memmapped()
  * @irq - irq
  * @devp - pointer to our soft state
- * @regs - unused
  *
  * Interrupt service routine for memory-mapped controllers.
  * Find out if our device is interrupting. If yes, acknowledge the interrupt
  * and service the completed commands.
  */
 static irqreturn_t
-megaraid_isr_memmapped(int irq, void *devp, struct pt_regs *regs)
+megaraid_isr_memmapped(int irq, void *devp)
 {
        adapter_t       *adapter = devp;
        unsigned long   flags;
@@ -1386,7 +1377,8 @@ megaraid_isr_memmapped(int irq, void *devp, struct pt_regs *regs)
 
                handled = 1;
 
-               while( RDINDOOR(adapter) & 0x02 ) cpu_relax();
+               while( RDINDOOR(adapter) & 0x02 )
+                       cpu_relax();
 
                mega_cmd_done(adapter, completed, nstatus, status);
 
@@ -1550,23 +1542,13 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
                islogical = adapter->logdrv_chan[cmd->device->channel];
                if( cmd->cmnd[0] == INQUIRY && !islogical ) {
 
-                       if( cmd->use_sg ) {
-                               sgl = (struct scatterlist *)
-                                       cmd->request_buffer;
-
-                               if( sgl->page ) {
-                                       c = *(unsigned char *)
-                                       page_address((&sgl[0])->page) +
-                                       (&sgl[0])->offset; 
-                               }
-                               else {
-                                       printk(KERN_WARNING
-                                               "megaraid: invalid sg.\n");
-                                       c = 0;
-                               }
-                       }
-                       else {
-                               c = *(u8 *)cmd->request_buffer;
+                       sgl = scsi_sglist(cmd);
+                       if( sg_page(sgl) ) {
+                               c = *(unsigned char *) sg_virt(&sgl[0]);
+                       } else {
+                               printk(KERN_WARNING
+                                      "megaraid: invalid sg.\n");
+                               c = 0;
                        }
 
                        if(IS_RAID_CH(adapter, cmd->device->channel) &&
@@ -1703,30 +1685,14 @@ mega_rundoneq (adapter_t *adapter)
 static void
 mega_free_scb(adapter_t *adapter, scb_t *scb)
 {
-       unsigned long length;
-
        switch( scb->dma_type ) {
 
        case MEGA_DMA_TYPE_NONE:
                break;
 
-       case MEGA_BULK_DATA:
-               if (scb->cmd->use_sg == 0)
-                       length = scb->cmd->request_bufflen;
-               else {
-                       struct scatterlist *sgl =
-                               (struct scatterlist *)scb->cmd->request_buffer;
-                       length = sgl->length;
-               }
-               pci_unmap_page(adapter->dev, scb->dma_h_bulkdata,
-                              length, scb->dma_direction);
-               break;
-
        case MEGA_SGLIST:
-               pci_unmap_sg(adapter->dev, scb->cmd->request_buffer,
-                       scb->cmd->use_sg, scb->dma_direction);
+               scsi_dma_unmap(scb->cmd);
                break;
-
        default:
                break;
        }
@@ -1753,7 +1719,8 @@ __mega_busywait_mbox (adapter_t *adapter)
        for (counter = 0; counter < 10000; counter++) {
                if (!mbox->m_in.busy)
                        return 0;
-               udelay(100); yield();
+               udelay(100);
+               cond_resched();
        }
        return -1;              /* give up after 1 second */
 }
@@ -1765,80 +1732,41 @@ __mega_busywait_mbox (adapter_t *adapter)
 static int
 mega_build_sglist(adapter_t *adapter, scb_t *scb, u32 *buf, u32 *len)
 {
-       struct scatterlist      *sgl;
-       struct page     *page;
-       unsigned long   offset;
-       unsigned int    length;
+       struct scatterlist *sg;
        Scsi_Cmnd       *cmd;
        int     sgcnt;
        int     idx;
 
        cmd = scb->cmd;
 
-       /* Scatter-gather not used */
-       if( cmd->use_sg == 0 || (cmd->use_sg == 1 && 
-                                !adapter->has_64bit_addr)) {
-
-               if (cmd->use_sg == 0) {
-                       page = virt_to_page(cmd->request_buffer);
-                       offset = offset_in_page(cmd->request_buffer);
-                       length = cmd->request_bufflen;
-               } else {
-                       sgl = (struct scatterlist *)cmd->request_buffer;
-                       page = sgl->page;
-                       offset = sgl->offset;
-                       length = sgl->length;
-               }
-
-               scb->dma_h_bulkdata = pci_map_page(adapter->dev,
-                                                 page, offset,
-                                                 length,
-                                                 scb->dma_direction);
-               scb->dma_type = MEGA_BULK_DATA;
-
-               /*
-                * We need to handle special 64-bit commands that need a
-                * minimum of 1 SG
-                */
-               if( adapter->has_64bit_addr ) {
-                       scb->sgl64[0].address = scb->dma_h_bulkdata;
-                       scb->sgl64[0].length = length;
-                       *buf = (u32)scb->sgl_dma_addr;
-                       *len = (u32)length;
-                       return 1;
-               }
-               else {
-                       *buf = (u32)scb->dma_h_bulkdata;
-                       *len = (u32)length;
-               }
-               return 0;
-       }
-
-       sgl = (struct scatterlist *)cmd->request_buffer;
-
        /*
         * Copy Scatter-Gather list info into controller structure.
         *
         * The number of sg elements returned must not exceed our limit
         */
-       sgcnt = pci_map_sg(adapter->dev, sgl, cmd->use_sg,
-                       scb->dma_direction);
+       sgcnt = scsi_dma_map(cmd);
 
        scb->dma_type = MEGA_SGLIST;
 
-       if( sgcnt > adapter->sglen ) BUG();
+       BUG_ON(sgcnt > adapter->sglen || sgcnt < 0);
 
        *len = 0;
 
-       for( idx = 0; idx < sgcnt; idx++, sgl++ ) {
+       if (scsi_sg_count(cmd) == 1 && !adapter->has_64bit_addr) {
+               sg = scsi_sglist(cmd);
+               scb->dma_h_bulkdata = sg_dma_address(sg);
+               *buf = (u32)scb->dma_h_bulkdata;
+               *len = sg_dma_len(sg);
+               return 0;
+       }
 
-               if( adapter->has_64bit_addr ) {
-                       scb->sgl64[idx].address = sg_dma_address(sgl);
-                       *len += scb->sgl64[idx].length = sg_dma_len(sgl);
-               }
-               else {
-                       scb->sgl[idx].address = sg_dma_address(sgl);
-                       *len += scb->sgl[idx].length = sg_dma_len(sgl);
+       scsi_for_each_sg(cmd, sg, sgcnt, idx) {
+               if (adapter->has_64bit_addr) {
+                       scb->sgl64[idx].address = sg_dma_address(sg);
+                       *len += scb->sgl64[idx].length = sg_dma_len(sg);
+               else {
+                       scb->sgl[idx].address = sg_dma_address(sg);
+                       *len += scb->sgl[idx].length = sg_dma_len(sg);
                }
        }
 
@@ -2039,8 +1967,8 @@ megaraid_abort_and_reset(adapter_t *adapter, Scsi_Cmnd *cmd, int aor)
                        scb->state |= aor;
 
                        /*
-                        * Check if this command has firmare owenership. If
-                        * yes, we cannot reset this command. Whenever, f/w
+                        * Check if this command has firmware ownership. If
+                        * yes, we cannot reset this command. Whenever f/w
                         * completes this command, we will return appropriate
                         * status from ISR.
                         */
@@ -2087,13 +2015,13 @@ megaraid_abort_and_reset(adapter_t *adapter, Scsi_Cmnd *cmd, int aor)
 static inline int
 make_local_pdev(adapter_t *adapter, struct pci_dev **pdev)
 {
-       *pdev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL);
+       *pdev = alloc_pci_dev();
 
        if( *pdev == NULL ) return -1;
 
        memcpy(*pdev, adapter->dev, sizeof(struct pci_dev));
 
-       if( pci_set_dma_mask(*pdev, 0xffffffff) != 0 ) {
+       if( pci_set_dma_mask(*pdev, DMA_BIT_MASK(32)) != 0 ) {
                kfree(*pdev);
                return -1;
        }
@@ -2820,9 +2748,7 @@ mega_print_inquiry(char *page, char *scsi_inq)
 
        i = scsi_inq[0] & 0x1f;
 
-       len += sprintf(page+len, "  Type:   %s ",
-               i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] :
-                  "Unknown          ");
+       len += sprintf(page+len, "  Type:   %s ", scsi_device_type(i));
 
        len += sprintf(page+len,
        "                 ANSI SCSI revision: %02x", scsi_inq[2] & 0x07);
@@ -3178,7 +3104,10 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
 
        return len;
 }
-
+#else
+static inline void mega_create_proc_entry(int index, struct proc_dir_entry *parent)
+{
+}
 #endif
 
 
@@ -3344,12 +3273,12 @@ mega_init_scb(adapter_t *adapter)
  * @filep - unused
  *
  * Routines for the character/ioctl interface to the driver. Find out if this
- * is a valid open. If yes, increment the module use count so that it cannot
- * be unloaded.
+ * is a valid open. 
  */
 static int
 megadev_open (struct inode *inode, struct file *filep)
 {
+       cycle_kernel_lock();
        /*
         * Only allow superuser to access private ioctl interface
         */
@@ -3568,7 +3497,7 @@ megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
                        /*
                         * The user passthru structure
                         */
-                       upthru = (mega_passthru __user *)MBOX(uioc)->xferaddr;
+                       upthru = (mega_passthru __user *)(unsigned long)MBOX(uioc)->xferaddr;
 
                        /*
                         * Copy in the user passthru here.
@@ -3620,7 +3549,7 @@ megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
                                /*
                                 * Get the user data
                                 */
-                               if( copy_from_user(data, (char __user *)uxferaddr,
+                               if( copy_from_user(data, (char __user *)(unsigned long) uxferaddr,
                                                        pthru->dataxferlen) ) {
                                        rval = (-EFAULT);
                                        goto freemem_and_return;
@@ -3646,7 +3575,7 @@ megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
                         * Is data going up-stream
                         */
                        if( pthru->dataxferlen && (uioc.flags & UIOC_RD) ) {
-                               if( copy_to_user((char __user *)uxferaddr, data,
+                               if( copy_to_user((char __user *)(unsigned long) uxferaddr, data,
                                                        pthru->dataxferlen) ) {
                                        rval = (-EFAULT);
                                }
@@ -3656,8 +3585,9 @@ megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
                         * Send the request sense data also, irrespective of
                         * whether the user has asked for it or not.
                         */
-                       copy_to_user(upthru->reqsensearea,
-                                       pthru->reqsensearea, 14);
+                       if (copy_to_user(upthru->reqsensearea,
+                                       pthru->reqsensearea, 14))
+                               rval = -EFAULT;
 
 freemem_and_return:
                        if( pthru->dataxferlen ) {
@@ -3698,7 +3628,7 @@ freemem_and_return:
                                /*
                                 * Get the user data
                                 */
-                               if( copy_from_user(data, (char __user *)uxferaddr,
+                               if( copy_from_user(data, (char __user *)(unsigned long) uxferaddr,
                                                        uioc.xferlen) ) {
 
                                        pci_free_consistent(pdev,
@@ -3738,7 +3668,7 @@ freemem_and_return:
                         * Is data going up-stream
                         */
                        if( uioc.xferlen && (uioc.flags & UIOC_RD) ) {
-                               if( copy_to_user((char __user *)uxferaddr, data,
+                               if( copy_to_user((char __user *)(unsigned long) uxferaddr, data,
                                                        uioc.xferlen) ) {
 
                                        rval = (-EFAULT);
@@ -4342,7 +4272,7 @@ mega_support_cluster(adapter_t *adapter)
        return 0;
 }
 
-
+#ifdef CONFIG_PROC_FS
 /**
  * mega_adapinq()
  * @adapter - pointer to our soft state
@@ -4447,7 +4377,7 @@ mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt,
 
        return rval;
 }
-
+#endif
 
 /**
  * mega_internal_command()
@@ -4469,29 +4399,30 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru)
 {
        Scsi_Cmnd       *scmd;
        struct  scsi_device *sdev;
-       unsigned long   flags = 0;
        scb_t   *scb;
        int     rval;
 
+       scmd = scsi_allocate_command(GFP_KERNEL);
+       if (!scmd)
+               return -ENOMEM;
+
        /*
         * The internal commands share one command id and hence are
         * serialized. This is so because we want to reserve maximum number of
         * available command ids for the I/O commands.
         */
-       down(&adapter->int_mtx);
+       mutex_lock(&adapter->int_mtx);
 
        scb = &adapter->int_scb;
        memset(scb, 0, sizeof(scb_t));
 
-       scmd = &adapter->int_scmd;
-       memset(scmd, 0, sizeof(Scsi_Cmnd));
-
-       sdev = kmalloc(sizeof(struct scsi_device), GFP_KERNEL);
-       memset(sdev, 0, sizeof(struct scsi_device));
+       sdev = kzalloc(sizeof(struct scsi_device), GFP_KERNEL);
        scmd->device = sdev;
 
+       memset(adapter->int_cdb, 0, sizeof(adapter->int_cdb));
+       scmd->cmnd = adapter->int_cdb;
        scmd->device->host = adapter->host;
-       scmd->buffer = (void *)scb;
+       scmd->host_scribble = (void *)scb;
        scmd->cmnd[0] = MEGA_INTERNAL_CMD;
 
        scb->state |= SCB_ACTIVE;
@@ -4526,7 +4457,9 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru)
                        mc->cmd, mc->opcode, mc->subopcode, scmd->result);
        }
 
-       up(&adapter->int_mtx);
+       mutex_unlock(&adapter->int_mtx);
+
+       scsi_free_command(GFP_KERNEL, scmd);
 
        return rval;
 }
@@ -4553,7 +4486,7 @@ mega_internal_done(Scsi_Cmnd *scmd)
 static struct scsi_host_template megaraid_template = {
        .module                         = THIS_MODULE,
        .name                           = "MegaRAID",
-       .proc_name                      = "megaraid",
+       .proc_name                      = "megaraid_legacy",
        .info                           = megaraid_info,
        .queuecommand                   = megaraid_queue,       
        .bios_param                     = megaraid_biosparam,
@@ -4670,6 +4603,8 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                host->host_no, mega_baseport, irq);
 
        adapter->base = mega_baseport;
+       if (flag & BOARD_MEMMAP)
+               adapter->mmio_base = (void __iomem *) mega_baseport;
 
        INIT_LIST_HEAD(&adapter->free_list);
        INIT_LIST_HEAD(&adapter->pending_list);
@@ -4713,7 +4648,7 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        if (request_irq(irq, (adapter->flag & BOARD_MEMMAP) ?
                                megaraid_isr_memmapped : megaraid_isr_iomapped,
-                                       SA_SHIRQ, "megaraid", adapter)) {
+                                       IRQF_SHARED, "megaraid", adapter)) {
                printk(KERN_WARNING
                        "megaraid: Couldn't register IRQ %d!\n", irq);
                goto out_free_scb_list;
@@ -4858,14 +4793,14 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        /* Set the Mode of addressing to 64 bit if we can */
        if ((adapter->flag & BOARD_64BIT) && (sizeof(dma_addr_t) == 8)) {
-               pci_set_dma_mask(pdev, 0xffffffffffffffffULL);
+               pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
                adapter->has_64bit_addr = 1;
        } else  {
-               pci_set_dma_mask(pdev, 0xffffffff);
+               pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                adapter->has_64bit_addr = 0;
        }
                
-       init_MUTEX(&adapter->int_mtx);
+       mutex_init(&adapter->int_mtx);
        init_completion(&adapter->int_waitq);
 
        adapter->this_id = DEFAULT_INITIATOR_ID;
@@ -4959,12 +4894,11 @@ __megaraid_shutdown(adapter_t *adapter)
                mdelay(1000);
 }
 
-static void
+static void __devexit
 megaraid_remove_one(struct pci_dev *pdev)
 {
        struct Scsi_Host *host = pci_get_drvdata(pdev);
        adapter_t *adapter = (adapter_t *)host->hostdata;
-       char    buf[12] = { 0 };
 
        scsi_remove_host(host);
 
@@ -5010,8 +4944,11 @@ megaraid_remove_one(struct pci_dev *pdev)
                remove_proc_entry("raiddrives-30-39",
                                adapter->controller_proc_dir_entry);
 #endif
-               sprintf(buf, "hba%d", adapter->host->host_no);
-               remove_proc_entry(buf, mega_proc_dir_entry);
+               {
+                       char    buf[12] = { 0 };
+                       sprintf(buf, "hba%d", adapter->host->host_no);
+                       remove_proc_entry(buf, mega_proc_dir_entry);
+               }
        }
 #endif
 
@@ -5037,28 +4974,18 @@ megaraid_shutdown(struct pci_dev *pdev)
 }
 
 static struct pci_device_id megaraid_pci_tbl[] = {
-       {PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DISCOVERY,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4_DI,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT},
-       {PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_PERC4_QC_VERDE,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT},
        {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID2,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_AMI_MEGARAID3,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {0,}
 };
 MODULE_DEVICE_TABLE(pci, megaraid_pci_tbl);
 
 static struct pci_driver megaraid_pci_driver = {
-       .name           = "megaraid",
+       .name           = "megaraid_legacy",
        .id_table       = megaraid_pci_tbl,
        .probe          = megaraid_probe_one,
        .remove         = __devexit_p(megaraid_remove_one),
@@ -5075,16 +5002,16 @@ static int __init megaraid_init(void)
                max_mbox_busy_wait = MBOX_BUSY_WAIT;
 
 #ifdef CONFIG_PROC_FS
-       mega_proc_dir_entry = proc_mkdir("megaraid", &proc_root);
+       mega_proc_dir_entry = proc_mkdir("megaraid", NULL);
        if (!mega_proc_dir_entry) {
                printk(KERN_WARNING
                                "megaraid: failed to create megaraid root\n");
        }
 #endif
-       error = pci_module_init(&megaraid_pci_driver);
+       error = pci_register_driver(&megaraid_pci_driver);
        if (error) {
 #ifdef CONFIG_PROC_FS
-               remove_proc_entry("megaraid", &proc_root);
+               remove_proc_entry("megaraid", NULL);
 #endif
                return error;
        }
@@ -5095,7 +5022,7 @@ static int __init megaraid_init(void)
         * First argument (major) to register_chrdev implies a dynamic
         * major number allocation.
         */
-       major = register_chrdev(0, "megadev", &megadev_fops);
+       major = register_chrdev(0, "megadev_legacy", &megadev_fops);
        if (!major) {
                printk(KERN_WARNING
                                "megaraid: failed to register char device\n");
@@ -5109,12 +5036,12 @@ static void __exit megaraid_exit(void)
        /*
         * Unregister the character device interface to the driver.
         */
-       unregister_chrdev(major, "megadev");
+       unregister_chrdev(major, "megadev_legacy");
 
        pci_unregister_driver(&megaraid_pci_driver);
 
 #ifdef CONFIG_PROC_FS
-       remove_proc_entry("megaraid", &proc_root);
+       remove_proc_entry("megaraid", NULL);
 #endif
 }