linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update
@ 2004-01-07  0:08 Eric Moore
  2004-01-07  4:40 ` Matt Domsch
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Eric Moore @ 2004-01-07  0:08 UTC (permalink / raw)
  To: linux-scsi, linux-kernel, 'James.Bottomley

Here's an driver update for mpt fusion driver version 3.00.00.

If you find this inline patch malformed,
please kindly download this patch from this URL:

ftp://ftp.lsil.com/HostAdapterDrivers/linux/Fusion-MPT/2.6-patches/

3.00.00 changes
* added new PCI API support
* added ACPI support
* added CONFIG_LBA, READ16, WRITE16 support
* underun fix
* chain buffer free list not being init properly
* reduce task management
    (abort=2sec,reset bus=5sec, timeout=10sec)



diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.c 
linux-2.6.1-rc2/drivers/message/fusion/mptbase.c
--- linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.c    
2004-01-06 14:17:58.000000000 -0700
+++ linux-2.6.1-rc2/drivers/message/fusion/mptbase.c    2004-01-06 
15:01:27.803311992 -0700
@@ -167,6 +167,7 @@
 static MPT_EVHANDLER         MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS];
                     /* Reset handler lookup table */
 static MPT_RESETHANDLER         MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS];
+static MPT_DVHANDLER         MptDvHandler[MPT_MAX_PROTOCOL_DRIVERS];
 
 static int    FusionInitCalled = 0;
 static int    mpt_base_index = -1;
@@ -183,7 +184,6 @@
 static int    mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, 
MPT_FRAME_HDR *reply);
 
 static int    mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int 
sleepFlag);
-static int    mpt_adapter_install(struct pci_dev *pdev);
 static void    mpt_detect_bound_ports(MPT_ADAPTER *this, struct pci_dev 
*pdev);
 static void    mpt_adapter_disable(MPT_ADAPTER *ioc, int freeup);
 static void    mpt_adapter_dispose(MPT_ADAPTER *ioc);
@@ -232,8 +232,11 @@
 static void    mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info);
 
-int        fusion_init(void);
-static void    fusion_exit(void);
+/* module entry point */
+static int  __devinit mptbase_probe (struct pci_dev *, const struct 
pci_device_id *);
+static void __devexit mptbase_remove(struct pci_dev *);
+static int  __init    fusion_init  (void);
+static void __exit    fusion_exit  (void);
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -260,6 +263,80 @@
 
 #endif
 
+/****************************************************************************
+ * Supported hardware
+ */
+#define    DEVT_INDEX_MPT        0x0000        /* Fusion MPT Interface */
+
+static struct pci_device_id mptbase_pci_table[] = {
+    {
+        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
+        .device        = PCI_DEVICE_ID_LSI_FC909,
+        .subvendor    = PCI_ANY_ID,
+        .subdevice    = PCI_ANY_ID,
+        .class        = PCI_CLASS_SERIAL_FIBER << 8,
+        .class_mask    = 0xFFFF00,
+        .driver_data    = DEVT_INDEX_MPT
+    },
+    {
+        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
+        .device        = PCI_DEVICE_ID_LSI_FC929,
+        .subvendor    = PCI_ANY_ID,
+        .subdevice    = PCI_ANY_ID,
+        .class        = PCI_CLASS_SERIAL_FIBER << 8,
+        .class_mask    = 0xFFFF00,
+        .driver_data    = DEVT_INDEX_MPT
+    },
+    {
+        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
+        .device        = PCI_DEVICE_ID_LSI_FC919,
+        .subvendor    = PCI_ANY_ID,
+        .subdevice    = PCI_ANY_ID,
+        .class        = PCI_CLASS_SERIAL_FIBER << 8,
+        .class_mask    = 0xFFFF00,
+        .driver_data    = DEVT_INDEX_MPT
+    },
+    {
+        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
+        .device        = PCI_DEVICE_ID_LSI_FC929X,
+        .subvendor    = PCI_ANY_ID,
+        .subdevice    = PCI_ANY_ID,
+        .class        = PCI_CLASS_SERIAL_FIBER << 8,
+        .class_mask    = 0xFFFF00,
+        .driver_data    = DEVT_INDEX_MPT
+    },
+    {
+        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
+        .device        = PCI_DEVICE_ID_LSI_FC919X,
+        .subvendor    = PCI_ANY_ID,
+        .subdevice    = PCI_ANY_ID,
+        .class        = PCI_CLASS_SERIAL_FIBER << 8,
+        .class_mask    = 0xFFFF00,
+        .driver_data    = DEVT_INDEX_MPT
+    },
+    {
+        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
+        .device        = PCI_DEVICE_ID_LSI_53C1030,
+        .subvendor    = PCI_ANY_ID,
+        .subdevice    = PCI_ANY_ID,
+        .class        = PCI_CLASS_STORAGE_SCSI << 8,
+        .class_mask    = 0xFFFF00,
+        .driver_data    = DEVT_INDEX_MPT
+    },
+    {
+        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
+        .device        = PCI_DEVICE_ID_LSI_1030_53C1035,
+        .subvendor    = PCI_ANY_ID,
+        .subdevice    = PCI_ANY_ID,
+        .class        = PCI_CLASS_STORAGE_SCSI << 8,
+        .class_mask    = 0xFFFF00,
+        .driver_data    = DEVT_INDEX_MPT
+    },
+    {0}    /* Terminating entry */
+};
+MODULE_DEVICE_TABLE(pci, mptbase_pci_table);
+
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /* 20000207 -sralston
  *  GRRRRR...  IOSpace (port i/o) register access (for the 909) is back!
@@ -803,6 +880,36 @@
     MptResetHandlers[cb_idx] = NULL;
 }
 
+
+#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *    mpt_dv_register - Register protocol-specific domain validation 
handler.
+ */
+int mpt_dv_register(MPT_DVHANDLER dv_cbfunc, int cb_idx)
+{
+    if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
+        return -1;
+
+    MptDvHandler[cb_idx] = dv_cbfunc;
+    return 0;
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *    mpt_dv_deregister - Deregister protocol-specific domain 
validation handler.
+ */
+void
+mpt_dv_deregister(int cb_idx)
+{
+    if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
+        return;
+
+    MptDvHandler[cb_idx] = NULL;
+}
+#endif
+
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
  *    mpt_get_msg_frame - Obtain a MPT request frame from the pool (of 
1024)
@@ -1142,88 +1249,6 @@
     return next;
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *    mpt_pci_scan - Scan PCI devices for MPT adapters.
- *
- *    Returns count of MPT adapters found, keying off of PCI vendor and
- *    device_id's.
- */
-static int __init
-mpt_pci_scan(void)
-{
-    struct pci_dev *pdev = NULL;
-    struct pci_dev *pdev2;
-    int found = 0;
-    int count = 0;
-    int r;
-
-    dprintk((KERN_INFO MYNAM ": Checking for MPT adapters...\n"));
-
-    /*
-     *  NOTE: The 929, 929X, 1030 and 1035 will appear as 2 separate 
PCI devices,
-     *  one for each channel.
-     */
-    while ((pdev = pci_find_device(PCI_VENDOR_ID_LSI_LOGIC, PCI_ANY_ID, 
pdev)) != NULL) {
-        pdev2 = NULL;
-        if ((pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC909) &&
-            (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC929) &&
-            (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC919) &&
-            (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC929X) &&
-            (pdev->device != MPI_MANUFACTPAGE_DEVICEID_FC919X) &&
-            (pdev->device != MPI_MANUFACTPAGE_DEVID_53C1030) &&
-            (pdev->device != MPI_MANUFACTPAGE_DEVID_1030_53C1035) &&
-            1) {
-            dprintk((KERN_INFO MYNAM ": Skipping LSI device=%04xh\n", 
pdev->device));
-            continue;
-        }
-
-        /* GRRRRR
-         * dual function devices (929, 929X, 1030, 1035) may be 
presented in Func 1,0 order,
-         * but we'd really really rather have them in Func 0,1 order.
-         * Do some kind of look ahead here...
-         */
-        if (pdev->devfn & 1) {
-            pdev2 = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev);
-            if (pdev2 && (pdev2->vendor == 0x1000) &&
-                (PCI_SLOT(pdev2->devfn) == PCI_SLOT(pdev->devfn)) &&
-                (pdev2->device == pdev->device) &&
-                (pdev2->bus->number == pdev->bus->number) &&
-                !(pdev2->devfn & 1)) {
-                dprintk((KERN_INFO MYNAM ": MPT adapter found: PCI 
bus/dfn=%02x/%02xh, class=%08x, id=%xh\n",
-                    pdev2->bus->number, pdev2->devfn, pdev2->class, 
pdev2->device));
-                found++;
-                if ((r = mpt_adapter_install(pdev2)) == 0)
-                    count++;
-            } else {
-                pdev2 = NULL;
-            }
-        }
-
-        dprintk((KERN_INFO MYNAM ": MPT adapter found: PCI 
bus/dfn=%02x/%02xh, class=%08x, id=%xh\n",
-             pdev->bus->number, pdev->devfn, pdev->class, pdev->device));
-        found++;
-        if ((r = mpt_adapter_install(pdev)) == 0)
-            count++;
-
-        if (pdev2)
-            pdev = pdev2;
-    }
-
-    printk(KERN_INFO MYNAM ": %d MPT adapter%s found, %d installed.\n",
-         found, (found==1) ? "" : "s", count);
-
-    if (!found || !count) {
-        fusion_exit();
-        return -ENODEV;
-    }
-
-#ifdef CONFIG_PROC_FS
-    (void) procmpt_create();
-#endif
-
-    return count;
-}
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
@@ -1253,7 +1278,7 @@
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
- *    mpt_adapter_install - Install a PCI intelligent MPT adapter.
+ *    mptbase_probe - Install a PCI intelligent MPT adapter.
  *    @pdev: Pointer to pci_dev structure
  *
  *    This routine performs all the steps necessary to bring the IOC of
@@ -1268,8 +1293,8 @@
  *
  *    TODO: Add support for polled controllers
  */
-static int __init
-mpt_adapter_install(struct pci_dev *pdev)
+static int
+__devinit mptbase_probe(struct pci_dev *pdev, const struct 
pci_device_id *id)
 {
     MPT_ADAPTER    *ioc;
     u8        *mem;
@@ -1292,6 +1317,13 @@
         return r;
     }
 
+    if (!pci_set_consistent_dma_mask(pdev, mask))
+        dprintk((KERN_INFO MYNAM
+            ": Using 64 bit consistent mask\n"));
+    else
+        dprintk((KERN_INFO MYNAM
+            ": Not using 64 bit consistent mask\n"));
+
     ioc = kmalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC);
     if (ioc == NULL) {
         printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add 
adapter!\n");
@@ -1500,6 +1532,7 @@
         ioc->pci_irq = pdev->irq;
 
         pci_set_master(pdev);            /* ?? */
+        pci_set_drvdata(pdev, ioc);
 
 #ifndef __sparc__
         dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", 
ioc->name, pdev->irq));
@@ -1525,6 +1558,146 @@
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
+ *    mptbase_remove - Remove a PCI intelligent MPT adapter.
+ *    @pdev: Pointer to pci_dev structure
+ *
+ */
+
+static void
+__devexit mptbase_remove(struct pci_dev *pdev)
+{
+    mptscsih_sync_irq(pdev->irq);
+    pci_set_drvdata(pdev, NULL);
+}
+
+
+/**************************************************************************
+ * Power Management
+ */
+#ifdef CONFIG_PM
+#include <acpi/acpi_drivers.h>
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
+ *    mptbase_suspend - Fusion MPT base driver suspend routine.
+ *
+ *
+ */
+static int mptbase_suspend(struct pci_dev *pdev, u32 state)
+{
+    u32 device_state;
+    MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
+
+    switch(state)
+    {
+        case ACPI_STATE_S1:
+            device_state=ACPI_STATE_D1;
+            break;
+        case ACPI_STATE_S3:
+        case ACPI_STATE_S4:
+            device_state=ACPI_STATE_D3;
+            break;
+        default:
+            return -EAGAIN /*FIXME*/;
+            break;
+    }
+
+    printk(MYIOC_s_INFO_FMT
+    "pci-suspend: pdev=0x%p, slot=%s, Entering operating state [D%d]\n",
+        ioc->name, pdev, pci_name(pdev), device_state);
+
+    pci_save_state(pdev, ioc->PciState);
+
+    /* put ioc into READY_STATE */
+    if(SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, CAN_SLEEP)) {
+        printk(MYIOC_s_ERR_FMT
+        "pci-suspend:  IOC msg unit reset failed!\n", ioc->name);
+    }
+
+    /* disable interrupts */
+    CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF);
+    ioc->active = 0;
+
+    /* Clear any lingering interrupt */
+    CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
+
+    pci_disable_device(pdev);
+    pci_set_power_state(pdev, device_state);
+
+    return 0;
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
+ *    mptbase_resume - Fusion MPT base driver resume routine.
+ *
+ *
+ */
+static int mptbase_resume(struct pci_dev *pdev)
+{
+    MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
+    u32 device_state = pdev->current_state;
+    int do_domain_validation_flag=0;
+    int recovery_state;
+
+    printk(MYIOC_s_INFO_FMT
+    "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n",
+        ioc->name, pdev, pci_name(pdev), device_state);
+
+    pci_set_power_state(pdev, ACPI_STATE_D0);
+    pci_restore_state(pdev, ioc->PciState);
+    pci_enable_device(pdev);
+
+    /* enable interrupts */
+    CHIPREG_WRITE32(&ioc->chip->IntMask, ~(MPI_HIM_RIM));
+    ioc->active = 1;
+
+    /* F/W not running */
+    if(!CHIPREG_READ32(&ioc->chip->Doorbell)) {
+        do_domain_validation_flag=1;
+    }
+
+    printk(MYIOC_s_INFO_FMT
+        "pci-resume: ioc-state=0x%x,doorbell=0x%x\n",
+        ioc->name,
+        (mpt_GetIocState(ioc, 1) >> MPI_IOC_STATE_SHIFT),
+        CHIPREG_READ32(&ioc->chip->Doorbell));
+
+    /* bring ioc to operational state */
+    if ((recovery_state = mpt_do_ioc_recovery(ioc,
+        MPT_HOSTEVENT_IOC_RECOVER, CAN_SLEEP)) != 0) {
+        printk(MYIOC_s_INFO_FMT
+            "pci-resume: Cannot recover, error:[%x]\n",
+            ioc->name, recovery_state);
+    } else {
+        printk(MYIOC_s_INFO_FMT
+            "pci-resume: success\n", ioc->name);
+    }
+
+#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
+    if(do_domain_validation_flag) {
+        int ii;
+
+        for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) {
+            ioc->spi_data.dvStatus[ii] |= MPT_SCSICFG_NEED_DV;
+        }
+
+        for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) {
+            if(MptDvHandler[ii]) {
+                printk(MYIOC_s_INFO_FMT
+                "pci-resume: domain validation\n",ioc->name);
+                (*(MptDvHandler[ii]))(NULL);
+            }
+        }
+    }
+#endif
+    return 0;
+}
+
+#endif
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*
  *    mpt_do_ioc_recovery - Initialize or recover MPT adapter.
  *    @ioc: Pointer to MPT adapter structure
  *    @reason: Event word / reason
@@ -5851,6 +6024,8 @@
 EXPORT_SYMBOL(mpt_event_deregister);
 EXPORT_SYMBOL(mpt_reset_register);
 EXPORT_SYMBOL(mpt_reset_deregister);
+EXPORT_SYMBOL(mpt_dv_register);
+EXPORT_SYMBOL(mpt_dv_deregister);
 EXPORT_SYMBOL(mpt_get_msg_frame);
 EXPORT_SYMBOL(mpt_put_msg_frame);
 EXPORT_SYMBOL(mpt_free_msg_frame);
@@ -5877,16 +6052,29 @@
 EXPORT_SYMBOL(mpt_ASCQ_TableSz);
 EXPORT_SYMBOL(mpt_ScsiOpcodesPtr);
 
+
+static struct pci_driver mptbase_driver = {
+    .name        = "mptbase",
+    .id_table    = mptbase_pci_table,
+    .probe        = mptbase_probe,
+    .remove        = __devexit_p(mptbase_remove),
+#ifdef CONFIG_PM
+    .suspend    = mptbase_suspend,
+    .resume        = mptbase_resume,
+#endif
+};
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *    fusion_init - Fusion MPT base driver initialization routine.
  *
  *    Returns 0 for success, non-zero for failure.
  */
-int __init
-fusion_init(void)
+static int
+__init fusion_init(void)
 {
     int i;
+    int r;
 
     if (FusionInitCalled++) {
         dprintk((KERN_INFO MYNAM ": INFO - Driver late-init entry point 
called\n"));
@@ -5920,10 +6108,13 @@
         /* FIXME! */
     }
 
-    if ((i = mpt_pci_scan()) < 0)
-        return i;
+    r = pci_module_init(&mptbase_driver);
 
-    return 0;
+#ifdef CONFIG_PROC_FS
+    (void) procmpt_create();
+#endif
+
+    return r;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -5934,13 +6125,14 @@
  *    and removes all %MPT_PROCFS_MPTBASEDIR entries.
  */
 static void
-fusion_exit(void)
+__exit fusion_exit(void)
 {
     MPT_ADAPTER *this;
-    struct pci_dev *pdev = NULL;
 
     dprintk((KERN_INFO MYNAM ": fusion_exit() called!\n"));
 
+    pci_unregister_driver(&mptbase_driver);
+
     /* Whups?  20010120 -sralston
      *  Moved this *above* removal of all MptAdapters!
      */
@@ -5956,9 +6148,6 @@
 
         this->active = 0;
 
-        pdev = (struct pci_dev *)this->pcidev;
-        mptscsih_sync_irq(pdev->irq);
-
         /* Clear any lingering interrupt */
         CHIPREG_WRITE32(&this->chip->IntStatus, 0);
 
@@ -5971,7 +6160,6 @@
     mpt_reset_deregister(mpt_base_index);
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
 module_init(fusion_init);
 module_exit(fusion_exit);
diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.h 
linux-2.6.1-rc2/drivers/message/fusion/mptbase.h
--- linux-2.6.1-rc2-reference/drivers/message/fusion/mptbase.h    
2004-01-06 14:17:58.000000000 -0700
+++ linux-2.6.1-rc2/drivers/message/fusion/mptbase.h    2003-12-19 
10:01:51.000000000 -0700
@@ -80,8 +80,8 @@
 #define COPYRIGHT    "Copyright (c) 1999-2003 " MODULEAUTHOR
 #endif
 
-#define MPT_LINUX_VERSION_COMMON    "2.05.00.05"
-#define MPT_LINUX_PACKAGE_NAME        "@(#)mptlinux-2.05.00.05"
+#define MPT_LINUX_VERSION_COMMON    "3.00.00"
+#define MPT_LINUX_PACKAGE_NAME        "@(#)mptlinux-3.00.00"
 #define WHAT_MAGIC_STRING        "@" "(" "#" ")"
 
 #define show_mptmod_ver(s,ver)  \
@@ -629,6 +629,9 @@
     FCPortPage0_t         fc_port_page0[2];
     LANPage0_t         lan_cnfg_page0;
     LANPage1_t         lan_cnfg_page1;
+#ifdef CONFIG_PM
+    u32                    PciState[64];     /* save PCI state to this 
area */
+#endif
     u8             FirstWhoInit;
     u8             upload_fw;    /* If set, do a fw upload */
     u8             reload_fw;    /* Force a FW Reload on next reset */
@@ -649,6 +652,7 @@
 typedef int (*MPT_CALLBACK)(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, 
MPT_FRAME_HDR *reply);
 typedef int (*MPT_EVHANDLER)(MPT_ADAPTER *ioc, EventNotificationReply_t 
*evReply);
 typedef int (*MPT_RESETHANDLER)(MPT_ADAPTER *ioc, int reset_phase);
+typedef void (*MPT_DVHANDLER)(void *arg);
 /* reset_phase defs */
 #define MPT_IOC_PRE_RESET        0
 #define MPT_IOC_POST_RESET        1
@@ -1001,6 +1005,8 @@
 extern void     mpt_event_deregister(int cb_idx);
 extern int     mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func);
 extern void     mpt_reset_deregister(int cb_idx);
+extern int     mpt_dv_register(MPT_DVHANDLER dv_cbfunc, int cb_idx);
+extern void     mpt_dv_deregister(int cb_idx);
 extern int     mpt_register_ascqops_strings(void *ascqTable, int 
ascqtbl_sz, const char **opsTable);
 extern void     mpt_deregister_ascqops_strings(void);
 extern MPT_FRAME_HDR    *mpt_get_msg_frame(int handle, int iocid);
diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.c 
linux-2.6.1-rc2/drivers/message/fusion/mptscsih.c
--- linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.c    
2004-01-06 14:17:58.000000000 -0700
+++ linux-2.6.1-rc2/drivers/message/fusion/mptscsih.c    2004-01-06 
14:25:16.000000000 -0700
@@ -164,8 +164,8 @@
 static MPT_FRAME_HDR *mptscsih_search_pendingQ(MPT_SCSI_HOST *hd, int 
scpnt_idx);
 static void    post_pendingQ_commands(MPT_SCSI_HOST *hd);
 
-static int    mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, 
u8 lun, int ctx2abort, int sleepFlag);
-static int    mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 
target, u8 lun, int ctx2abort, int sleepFlag);
+static int    mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, 
u8 lun, int ctx2abort, ulong timeout, int sleepFlag);
+static int    mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 
target, u8 lun, int ctx2abort, ulong timeout, int sleepFlag);
 
 static int    mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
 static int    mptscsih_event_process(MPT_ADAPTER *ioc, 
EventNotificationReply_t *pEvReply);
@@ -196,6 +196,12 @@
 static int    mptscsih_setup(char *str);
 static int    mptscsih_halt(struct notifier_block *nb, ulong event, 
void *buf);
 
+/* module entry point */
+static int  __init    mptscsih_init  (void);
+static void __exit    mptscsih_exit  (void);
+int mptscsih_release(struct Scsi_Host *host);
+
+
 /*
  *    Reboot Notification
  */
@@ -238,6 +244,34 @@
     driver_setup = MPTSCSIH_DRIVER_SETUP;
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+
+/* see mptscsih.h */
+
+#ifdef MPT_SCSIHOST_NEED_ENTRY_EXIT_HOOKUPS
+static Scsi_Host_Template driver_template = {
+    .proc_name            = "mptscsih",
+    .proc_info            = x_scsi_proc_info,
+    .name                = "MPT SCSI Host",
+    .info                = x_scsi_info,
+    .queuecommand            = x_scsi_queuecommand,
+    .slave_alloc            = x_scsi_slave_alloc,
+    .slave_configure        = x_scsi_slave_configure,
+    .slave_destroy            = x_scsi_slave_destroy,
+    .eh_abort_handler        = x_scsi_abort,
+    .eh_device_reset_handler    = x_scsi_dev_reset,
+    .eh_bus_reset_handler        = x_scsi_bus_reset,
+    .eh_host_reset_handler        = x_scsi_host_reset,
+    .bios_param            = x_scsi_bios_param,
+    .can_queue            = MPT_SCSI_CAN_QUEUE,
+    .this_id            = -1,
+    .sg_tablesize            = MPT_SCSI_SG_DEPTH,
+    .max_sectors            = MPT_SCSI_MAX_SECTORS,
+    .cmd_per_lun            = MPT_SCSI_CMD_PER_LUN,
+    .use_clustering            = ENABLE_CLUSTERING,
+};
+#endif
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *  Private inline routines...
  */
@@ -264,12 +298,14 @@
 mptscsih_io_direction(Scsi_Cmnd *cmd)
 {
     switch (cmd->cmnd[0]) {
-    case WRITE_6:       
-    case WRITE_10:       
+    case WRITE_6:
+    case WRITE_10:
+    case WRITE_16:
         return SCSI_DATA_WRITE;
         break;
-    case READ_6:       
-    case READ_10:       
+    case READ_6:
+    case READ_10:
+    case READ_16:
         return SCSI_DATA_READ;
         break;
     }
@@ -280,6 +316,7 @@
     switch (cmd->cmnd[0]) {
     /*  _DATA_OUT commands    */
     case WRITE_6:        case WRITE_10:        case WRITE_12:
+    case WRITE_16:
     case WRITE_LONG:    case WRITE_SAME:    case WRITE_BUFFER:
     case WRITE_VERIFY:    case WRITE_VERIFY_12:
     case COMPARE:        case COPY:        case COPY_VERIFY:
@@ -826,6 +863,13 @@
             sc->resid = sc->request_bufflen - xfer_cnt;
             dprintk((KERN_NOTICE "  SET sc->resid=%02xh\n", sc->resid));
 
+            if(sc->underflow > xfer_cnt) {
+                printk(MYIOC_s_INFO_FMT
+                "SCSI data underrun: underflow=%02x, xfercnt=%02x\n",
+                ioc->name, sc->underflow, xfer_cnt);
+                sc->result = DID_SOFT_ERROR << 16;
+            }
+
             /* Report Queue Full
              */
             if (sc->result == MPI_SCSI_STATUS_TASK_SET_FULL)
@@ -1231,8 +1275,9 @@
     } else {
         mem = (u8 *) hd->ReqToChain;
     }
-    memset(mem, 0xFF, sz);
-
+/*    memset(mem, 0xFF, sz); */
+    for(ii=0;ii<hd->ioc->req_depth;ii++)
+        hd->ReqToChain[ii] = MPT_HOST_NO_CHAIN;
 
     /* ChainToChain size must equal the total number
      * of chain buffers to be allocated.
@@ -1275,7 +1320,6 @@
         mem = (u8 *) hd->ChainToChain;
     }
     memset(mem, 0xFF, sz);
-
     sz = num_chain * hd->ioc->req_sz;
     if (hd->ChainBuffer == NULL) {
         /* Allocate free chain buffer pool
@@ -1357,18 +1401,13 @@
 /*  SCSI host fops start here...  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
- *    mptscsih_detect - Register MPT adapter(s) as SCSI host(s) with
+ *    mptscsih_init - Register MPT adapter(s) as SCSI host(s) with
  *    linux scsi mid-layer.
- *    @tpnt: Pointer to Scsi_Host_Template structure
  *
- *    (linux Scsi_Host_Template.detect routine)
- *
- *    Returns number of SCSI host adapters that were successfully
- *    registered with the linux scsi mid-layer via the scsi_register()
- *    API call.
+ *    Returns 0 for success, non-zero for failure.
  */
-int
-mptscsih_detect(Scsi_Host_Template *tpnt)
+static int
+__init mptscsih_init(void)
 {
     struct Scsi_Host    *sh = NULL;
     MPT_SCSI_HOST        *hd = NULL;
@@ -1387,6 +1426,12 @@
         ScsiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, 
MPTSCSIH_DRIVER);
         ScsiScanDvCtx = mpt_register(mptscsih_scandv_complete, 
MPTSCSIH_DRIVER);
 
+#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
+        if(mpt_dv_register(mptscsih_domainValidation, MPTSCSIH_DRIVER) 
!= 0 ) {
+            dprintk((KERN_INFO MYNAM
+            ": failed to register dv callback\n"));
+        }
+#endif
         if (mpt_event_register(ScsiDoneCtx, mptscsih_event_process) == 0) {
             dprintk((KERN_INFO MYNAM ": Registered for IOC event 
notifications\n"));
         } else {
@@ -1431,14 +1476,17 @@
                 continue;
             }
 
-            tpnt->proc_info = mptscsih_proc_info;
-            sh = scsi_register(tpnt, sizeof(MPT_SCSI_HOST));
+            sh = scsi_host_alloc(&driver_template, sizeof(MPT_SCSI_HOST));
             if (sh != NULL) {
                 spin_lock_irqsave(&this->FreeQlock, flags);
                 sh->io_port = 0;
                 sh->n_io_port = 0;
                 sh->irq = 0;
 
+                /* set 16 byte cdb's
+                */
+                sh->max_cmd_len = 16;
+
                 /* Yikes!  This is important!
                  * Otherwise, by default, linux
                  * only scans target IDs 0-7!
@@ -1634,7 +1682,7 @@
                     hd->ioc->spi_data.forceDv = 0;
                     for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++)
                         hd->ioc->spi_data.dvStatus[ii] = 
MPT_SCSICFG_NEGOTIATE;
-   
+
                     if (hd->negoNvram == 0) {
                         for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++)
                             hd->ioc->spi_data.dvStatus[ii] |= 
MPT_SCSICFG_DV_NOT_DONE;
@@ -1649,6 +1697,10 @@
                 }
 
                 mpt_scsi_hosts++;
+
+                scsi_add_host (sh, &this->pcidev->dev);
+                scsi_scan_host(sh);
+
             }
 
         }    /* for each adapter port */
@@ -1657,24 +1709,62 @@
     }
 
 done:
-    if (mpt_scsi_hosts > 0)
+    if (mpt_scsi_hosts > 0) {
         register_reboot_notifier(&mptscsih_notifier);
-    else {
+        return 0;
+    } else {
         mpt_reset_deregister(ScsiDoneCtx);
         dprintk((KERN_INFO MYNAM ": Deregistered for IOC reset 
notifications\n"));
 
         mpt_event_deregister(ScsiDoneCtx);
         dprintk((KERN_INFO MYNAM ": Deregistered for IOC event 
notifications\n"));
 
+#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
+        mpt_dv_deregister(MPTSCSIH_DRIVER);
+#endif
         mpt_deregister(ScsiScanDvCtx);
         mpt_deregister(ScsiTaskCtx);
         mpt_deregister(ScsiDoneCtx);
 
         if (info_kbuf != NULL)
             kfree(info_kbuf);
+
+        return -EBUSY;
     }
 
-    return mpt_scsi_hosts;
+}
+
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ *    mptscsih_exit - Unregisters MPT adapter(s)
+ *
+ */
+static void
+__exit mptscsih_exit(void)
+{
+    MPT_ADAPTER        *this;
+    struct Scsi_Host    *sh = NULL;
+
+    this = mpt_adapter_find_first();
+    while (this != NULL) {
+
+        if (this->last_state != MPI_IOC_STATE_OPERATIONAL) {
+            this = mpt_adapter_find_next(this);
+            continue;
+        }
+
+        sh = this->sh;
+        if( sh == NULL ) {
+            continue;
+        }
+
+        scsi_remove_host(sh);
+        mptscsih_release(sh);
+        scsi_host_put(sh);
+        this->sh = NULL;
+        this = mpt_adapter_find_next(this);
+    }
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1801,7 +1891,6 @@
     /* NULL the Scsi_Host pointer
      */
     hd->ioc->sh = NULL;
-    scsi_unregister(host);
 
     if (mpt_scsi_hosts) {
         if (--mpt_scsi_hosts == 0) {
@@ -1811,6 +1900,10 @@
             mpt_event_deregister(ScsiDoneCtx);
             dprintk((KERN_INFO MYNAM ": Deregistered for IOC event 
notifications\n"));
 
+#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
+            mpt_dv_deregister(MPTSCSIH_DRIVER);
+#endif
+
             mpt_deregister(ScsiScanDvCtx);
             mpt_deregister(ScsiTaskCtx);
             mpt_deregister(ScsiDoneCtx);
@@ -2606,7 +2699,7 @@
  *    Returns 0 for SUCCESS or -1 if FAILED.
  */
 static int
-mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int 
ctx2abort, int sleepFlag)
+mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, int 
ctx2abort, ulong timeout, int sleepFlag)
 {
     MPT_ADAPTER    *ioc = NULL;
     int         rc = -1;
@@ -2662,7 +2755,7 @@
          */
         if (hd->hard_resets < -1)
             hd->hard_resets++;
-        rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, 
sleepFlag);
+        rc = mptscsih_IssueTaskMgmt(hd, type, target, lun, ctx2abort, 
timeout, sleepFlag);
         if (rc) {
             printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n", 
hd->ioc->name);
         } else {
@@ -2708,7 +2801,7 @@
  *    else other non-zero value returned.
  */
 static int
-mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, 
int ctx2abort, int sleepFlag)
+mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 target, u8 lun, 
int ctx2abort, ulong timeout, int sleepFlag)
 {
     MPT_FRAME_HDR    *mf;
     SCSITaskMgmt_t    *pScsiTm;
@@ -2758,7 +2851,7 @@
     */
     hd->tmPtr = mf;
     hd->numTMrequests++;
-    hd->TMtimer.expires = jiffies + HZ*20;  /* 20 seconds */
+    hd->TMtimer.expires = jiffies + timeout;
     add_timer(&hd->TMtimer);
 
     if ((retval = mpt_send_handshake_request(ScsiTaskCtx, hd->ioc->id,
@@ -2868,7 +2961,8 @@
 
     spin_unlock_irq(host_lock);
     if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
-                           SCpnt->device->id, SCpnt->device->lun, 
ctx2abort, CAN_SLEEP)
+        SCpnt->device->id, SCpnt->device->lun,
+        ctx2abort, (HZ*2) /* 2 second timeout */,CAN_SLEEP)
         < 0) {
 
         /* The TM request failed and the subsequent FW-reload failed!
@@ -2938,7 +3032,7 @@
     }
 
     if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
-                           SCpnt->device->id, 0, 0, CAN_SLEEP)
+        SCpnt->device->id, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP)
         < 0){
         /* The TM request failed and the subsequent FW-reload failed!
          * Fatal error case.
@@ -3002,7 +3096,7 @@
 
     /* We are now ready to execute the task management request. */
     if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
-                           0, 0, 0, CAN_SLEEP)
+        0, 0, 0, (HZ*5) /* 5 second timeout */, CAN_SLEEP)
         < 0){
 
         /* The TM request failed and the subsequent FW-reload failed!
@@ -3085,7 +3179,7 @@
 mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd)
 {
     unsigned long  flags;
-    int            loop_count = 60 * 4;  /* Wait 60 seconds */
+    int            loop_count = 10 * 4;  /* Wait 10 seconds */
     int            status = FAILED;
 
     do {
@@ -3225,18 +3319,50 @@
  */
 int
 mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
-        sector_t capacity, int *ip)
+        sector_t capacity, int geom[])
 {
-    int size;
+    int        heads;
+    int        sectors;
+    sector_t    cylinders;
+#ifdef CONFIG_LBD
+    ulong         dummy;
+#endif
 
-    size = capacity;
-    ip[0] = 64;                /* heads            */
-    ip[1] = 32;                /* sectors            */
-    if ((ip[2] = size >> 11) > 1024) {    /* cylinders, test for big 
disk */
-        ip[0] = 255;            /* heads            */
-        ip[1] = 63;            /* sectors            */
-        ip[2] = size / (255 * 63);    /* cylinders            */
+    heads = 64;
+    sectors = 32;
+#ifdef CONFIG_LBD
+    dummy = heads * sectors;
+    cylinders = capacity;
+    do_div(cylinders,dummy);
+#else
+    cylinders = (ulong)capacity / (heads * sectors);
+#endif
+
+    /*
+     * Handle extended translation size for logical drives
+     * > 1Gb
+     */
+    if ((ulong)capacity >= 0x200000) {
+        heads = 255;
+        sectors = 63;
+#ifdef CONFIG_LBD
+        dummy = heads * sectors;
+        cylinders = capacity;
+        do_div(cylinders,dummy);
+#else
+        cylinders = (ulong)capacity / (heads * sectors);
+#endif
     }
+
+    /* return result */
+    geom[0] = heads;
+    geom[1] = sectors;
+    geom[2] = cylinders;
+
+    dprintk((KERN_NOTICE
+        ": bios_param: Id=%i Lun=%i Channel=%i CHS=%i/%i/%i\n",
+        sdev->id, sdev->lun,sdev->channel,(int)cylinders,heads,sectors));
+
     return 0;
 }
 
@@ -3366,7 +3492,7 @@
             vdev->raidVolume = 0;
             if (hd->is_spi && (hd->ioc->spi_data.isRaid & (1 << 
(device->id)))) {
                 vdev->raidVolume = 1;
-                ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", target_id));
+                ddvtprintk((KERN_INFO "RAID Volume @ id %d\n", 
device->id));
             }
 
             mptscsih_target_settings(hd, vdev, device);
@@ -3648,36 +3774,6 @@
     return -1;
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-
-/* see mptscsih.h */
-
-#ifdef MPT_SCSIHOST_NEED_ENTRY_EXIT_HOOKUPS
-static Scsi_Host_Template driver_template = {
-    .proc_name            = "mptscsih",
-    .proc_info            = x_scsi_proc_info,
-    .name                = "MPT SCSI Host",
-    .detect                = x_scsi_detect,
-    .release            = x_scsi_release,
-    .info                = x_scsi_info,   
-    .queuecommand            = x_scsi_queuecommand,
-    .slave_alloc            = x_scsi_slave_alloc,
-    .slave_configure        = x_scsi_slave_configure,
-    .slave_destroy            = x_scsi_slave_destroy,
-    .eh_abort_handler        = x_scsi_abort,
-    .eh_device_reset_handler    = x_scsi_dev_reset,
-    .eh_bus_reset_handler        = x_scsi_bus_reset,
-    .eh_host_reset_handler        = x_scsi_host_reset,
-    .bios_param            = x_scsi_bios_param,
-    .can_queue            = MPT_SCSI_CAN_QUEUE,
-    .this_id            = -1,
-    .sg_tablesize            = MPT_SCSI_SG_DEPTH,
-    .max_sectors            = MPT_SCSI_MAX_SECTORS,
-    .cmd_per_lun            = MPT_SCSI_CMD_PER_LUN,
-    .use_clustering            = ENABLE_CLUSTERING,
-};
-#include "../../scsi/scsi_module.c"
-#endif
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /* Search the pendingQ for a command with specific index.
@@ -4318,6 +4414,8 @@
     case WRITE_10:
     case READ_12:
     case WRITE_12:
+    case READ_16:
+    case WRITE_16:
         break;
     default:
         return 0;
@@ -5413,7 +5511,7 @@
                 flags = hd->ioc->spi_data.noQas;
                 if (hd->ioc->spi_data.nvram && 
(hd->ioc->spi_data.nvram[id] != MPT_HOST_NVRAM_INVALID)) {
                     data = hd->ioc->spi_data.nvram[id];
-   
+
                     if (data & MPT_NVRAM_WIDE_DISABLE)
                         flags |= MPT_TARGET_NO_NEGO_WIDE;
 
@@ -5518,7 +5616,7 @@
             /* DV only to SCSI adapters */
             if ((int)ioc->chip_type <= (int)FC929)
                 continue;
-           
+
             /* Make sure everything looks ok */
             if (ioc->sh == NULL)
                 continue;
@@ -7007,3 +7105,6 @@
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
+
+module_init(mptscsih_init);
+module_exit(mptscsih_exit);
diff -uarN linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.h 
linux-2.6.1-rc2/drivers/message/fusion/mptscsih.h
--- linux-2.6.1-rc2-reference/drivers/message/fusion/mptscsih.h    
2004-01-06 14:17:58.000000000 -0700
+++ linux-2.6.1-rc2/drivers/message/fusion/mptscsih.h    2003-12-16 
12:18:46.000000000 -0700
@@ -160,8 +160,6 @@
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
-#define x_scsi_detect        mptscsih_detect
-#define x_scsi_release        mptscsih_release
 #define x_scsi_info        mptscsih_info
 #define x_scsi_queuecommand    mptscsih_qcmd
 #define x_scsi_abort        mptscsih_abort
@@ -170,9 +168,6 @@
 #define x_scsi_host_reset    mptscsih_host_reset
 #define x_scsi_bios_param    mptscsih_bios_param
 
-#define x_scsi_taskmgmt_bh    mptscsih_taskmgmt_bh
-#define x_scsi_old_abort    mptscsih_old_abort
-#define x_scsi_old_reset    mptscsih_old_reset
 #define x_scsi_slave_alloc    mptscsih_slave_alloc
 #define x_scsi_slave_configure    mptscsih_slave_configure
 #define x_scsi_slave_destroy    mptscsih_slave_destroy
@@ -182,8 +177,6 @@
 /*
  *    MPT SCSI Host / Initiator decls...
  */
-extern    int         x_scsi_detect(Scsi_Host_Template *);
-extern    int         x_scsi_release(struct Scsi_Host *host);
 extern    const char    *x_scsi_info(struct Scsi_Host *);
 extern    int         x_scsi_queuecommand(Scsi_Cmnd *, void 
(*done)(Scsi_Cmnd *));
 extern    int         x_scsi_abort(Scsi_Cmnd *);
@@ -191,8 +184,7 @@
 extern    int         x_scsi_dev_reset(Scsi_Cmnd *);
 extern    int         x_scsi_host_reset(Scsi_Cmnd *);
 extern int         x_scsi_bios_param(struct scsi_device * sdev, struct 
block_device *bdev,
-                sector_t capacity, int *ip);
-extern    void         x_scsi_taskmgmt_bh(void *);
+                sector_t capacity, int geom[]);
 extern    int         x_scsi_slave_alloc(Scsi_Device *);
 extern    int         x_scsi_slave_configure(Scsi_Device *);
 extern    void         x_scsi_slave_destroy(Scsi_Device *);



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update
  2004-01-07  0:08 [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update Eric Moore
@ 2004-01-07  4:40 ` Matt Domsch
  2004-01-07  8:55 ` Arjan van de Ven
  2004-01-07 17:09 ` Matthew Wilcox
  2 siblings, 0 replies; 5+ messages in thread
From: Matt Domsch @ 2004-01-07  4:40 UTC (permalink / raw)
  To: Eric Moore; +Cc: linux-scsi, linux-kernel, 'James.Bottomley

On Tue, Jan 06, 2004 at 05:08:47PM -0700, Eric Moore wrote:
> Here's an driver update for mpt fusion driver version 3.00.00.

Eric, since this is for 2.6.x, need the driver export anything in
/proc anymore, preferring to export via sysfs instead?

Thanks,
Matt

-- 
Matt Domsch
Sr. Software Engineer, Lead Engineer
Dell Linux Solutions www.dell.com/linux
Linux on Dell mailing lists @ http://lists.us.dell.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update
  2004-01-07  0:08 [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update Eric Moore
  2004-01-07  4:40 ` Matt Domsch
@ 2004-01-07  8:55 ` Arjan van de Ven
  2004-01-07 17:09 ` Matthew Wilcox
  2 siblings, 0 replies; 5+ messages in thread
From: Arjan van de Ven @ 2004-01-07  8:55 UTC (permalink / raw)
  To: Eric Moore; +Cc: linux-scsi, linux-kernel, 'James.Bottomley

[-- Attachment #1: Type: text/plain, Size: 1249 bytes --]

On Wed, 2004-01-07 at 01:08, Eric Moore wrote:
> +/**************************************************************************
> + * Power Management
> + */
> +#ifdef CONFIG_PM
> +#include <acpi/acpi_drivers.h>
> +
> +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
> +/*
> + *    mptbase_suspend - Fusion MPT base driver suspend routine.
> + *
> + *
> + */
> +static int mptbase_suspend(struct pci_dev *pdev, u32 state)
> +{
> +    u32 device_state;
> +    MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
> +
> +    switch(state)
> +    {
> +        case ACPI_STATE_S1:

this looks really really wrong. Linux suspend and resume are absolutely
not acpi specific and drivers should not use ACPI specific defines that
also just may mean something different than the linux API means!
> @@ -264,12 +298,14 @@
>  mptscsih_io_direction(Scsi_Cmnd *cmd)


why can't you use the scsi layer IO direction function ???
>  
> +#ifndef MPTSCSIH_DISABLE_DOMAIN_VALIDATION
> +        mpt_dv_deregister(MPTSCSIH_DRIVER);
> +#endif

I would suggest making mpt_dv_deregister() and co a nop in the DISABLE
case, that way you don't need ifdefs all over the driver but just around
the entire functions....


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update
  2004-01-07  0:08 [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update Eric Moore
  2004-01-07  4:40 ` Matt Domsch
  2004-01-07  8:55 ` Arjan van de Ven
@ 2004-01-07 17:09 ` Matthew Wilcox
  2 siblings, 0 replies; 5+ messages in thread
From: Matthew Wilcox @ 2004-01-07 17:09 UTC (permalink / raw)
  To: Eric Moore; +Cc: linux-scsi, linux-kernel, James.Bottomley

On Tue, Jan 06, 2004 at 05:08:47PM -0700, Eric Moore wrote:
> +static struct pci_device_id mptbase_pci_table[] = {
> +    {
> +        .vendor        = PCI_VENDOR_ID_LSI_LOGIC,
> +        .device        = PCI_DEVICE_ID_LSI_FC909,
> +        .subvendor    = PCI_ANY_ID,
> +        .subdevice    = PCI_ANY_ID,
> +        .class        = PCI_CLASS_SERIAL_FIBER << 8,
> +        .class_mask    = 0xFFFF00,
> +        .driver_data    = DEVT_INDEX_MPT
> +    },

This is all pretty verbose.  The normal style for device drivers is:

static struct pci_device_id mptbase_pci_table[] = {
	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC909,
		PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVT_INDEX_MPT },
	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929,
		PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVT_INDEX_MPT },
	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919,
		PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVT_INDEX_MPT },
	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929X,
		PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVT_INDEX_MPT },
	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919X,
		PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVT_INDEX_MPT },
	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1030,
		PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVT_INDEX_MPT },
	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1035,
		PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVT_INDEX_MPT },
	{ }
}

Although since you don't make any use of DEVT_INDEX_MPT, you can drop the last
three entries and simply write:

	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1035,
		PCI_ANY_ID, PCI_ANY_ID },

-- 
"Next the statesmen will invent cheap lies, putting the blame upon 
the nation that is attacked, and every man will be glad of those
conscience-soothing falsities, and will diligently study them, and refuse
to examine any refutations of them; and thus he will by and by convince 
himself that the war is just, and will thank God for the better sleep 
he enjoys after this process of grotesque self-deception." -- Mark Twain

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update
@ 2004-01-07 16:11 Moore, Eric Dean
  0 siblings, 0 replies; 5+ messages in thread
From: Moore, Eric Dean @ 2004-01-07 16:11 UTC (permalink / raw)
  To: Matt Domsch; +Cc: linux-scsi, linux-kernel, James.Bottomley

The sysfs support is on my todo list.  
Probally Feburary timeframe.

Eric

On Tuesday, January 06, 2004 9:40 PM, Matt Domsch wrote:
> On Tue, Jan 06, 2004 at 05:08:47PM -0700, Eric Moore wrote:
> > Here's an driver update for mpt fusion driver version 3.00.00.
> 
> Eric, since this is for 2.6.x, need the driver export anything in
> /proc anymore, preferring to export via sysfs instead?
> 
> Thanks,
> Matt
> 
> -- 
> Matt Domsch
> Sr. Software Engineer, Lead Engineer
> Dell Linux Solutions www.dell.com/linux
> Linux on Dell mailing lists @ http://lists.us.dell.com
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2004-01-07 17:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-01-07  0:08 [PATCH] 2.6.1-rc2 - MPT Fusion driver 3.00.00 update Eric Moore
2004-01-07  4:40 ` Matt Domsch
2004-01-07  8:55 ` Arjan van de Ven
2004-01-07 17:09 ` Matthew Wilcox
2004-01-07 16:11 Moore, Eric Dean

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).